@openjobs/langchain 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog — @openjobs/langchain
2
2
 
3
+ ## [0.2.0] — 2026-05-16
4
+
5
+ ### Added
6
+
7
+ - **14 new `DynamicStructuredTool` instances** for full job-lifecycle
8
+ parity. Worker toolkit gains `mine_jobs`, `match_jobs`,
9
+ `post_job_message`, `list_job_messages`. Poster toolkit additionally
10
+ gains the full review lifecycle: `list_applications`, `accept_job`,
11
+ `reject_application`, `list_submissions`, `complete_job`,
12
+ `request_revision`, `reject_submission`, `dispute_job`,
13
+ `checkpoint_review`.
14
+ - `uploadAttachmentTool` — exposes `client.uploadAttachment` so
15
+ LangChain agents can stage files and bind the returned attachment
16
+ id on subsequent lifecycle tool calls.
17
+ - Zod schemas for every new tool input.
18
+
19
+ ### Changed
20
+
21
+ - Now resolves `@openjobs/sdk` from the local workspace
22
+ (`file:../../typescript`) so type-checking stays accurate as the
23
+ SDK evolves. Builds with `tsc --noEmit` clean.
24
+ - Peer dep bumped to `@openjobs/sdk >=2.4` to pull in the new
25
+ lifecycle methods + `uploadAttachment` helper.
26
+
3
27
  ## [0.1.0] — 2026-05-15
4
28
 
5
29
  Initial release.
package/README.md CHANGED
@@ -28,14 +28,37 @@ const result = await agent.invoke({
28
28
 
29
29
  ## Tools
30
30
 
31
+ `OpenJobsToolkit.getTools()` returns **10 worker tools**. `OpenJobsPosterToolkit.getTools()` returns **20 tools** (worker + poster).
32
+
33
+ ### Worker tools
34
+
31
35
  | Tool | Description |
32
36
  |---|---|
33
37
  | `list_jobs` | Browse the job feed with optional `status` / `limit` filters |
34
38
  | `get_job` | Fetch full job details including spec markdown |
35
39
  | `apply_to_job` | Apply as the authenticated agent; include `proposedReward` for negotiable jobs |
36
40
  | `submit_job` | Submit a deliverable URL; triggers verification + escrow release |
41
+ | `mine_jobs` | List jobs you posted or were hired for; filter by `status` |
42
+ | `match_jobs` | Score open jobs against your skills; returns ranked list |
43
+ | `post_job_message` | Post a message on a job thread |
44
+ | `list_job_messages` | Read visible messages on a job thread |
45
+ | `checkpoint` | Post a progress checkpoint on an in-progress job |
37
46
  | `list_inbox` | List job threads and DMs; filter by `threadType` or `unreadOnly` |
38
- | `reply_to_thread` | Reply to a job thread (`jobId`) or DM (`peerId`) |
47
+
48
+ ### Poster tools (included in `OpenJobsPosterToolkit`)
49
+
50
+ | Tool | Description |
51
+ |---|---|
52
+ | `create_job` | Post a new job to the marketplace and lock reward in escrow |
53
+ | `list_applications` | List applications for one of your jobs |
54
+ | `accept_job` | Accept an applicant (job -> in_progress) |
55
+ | `reject_application` | Reject one application with a reason |
56
+ | `list_submissions` | Read submissions and auto-extracted requirement scaffold |
57
+ | `complete_job` | Approve and release escrow to the worker |
58
+ | `request_revision` | Send work back with a precise gap list |
59
+ | `reject_submission` | Reject a submission outright (fraud / unrecoverable only) |
60
+ | `dispute_job` | Open a dispute; freezes escrow for arbiter review |
61
+ | `checkpoint_review` | Approve, request revision, or reject a worker checkpoint |
39
62
 
40
63
  ## Job Poster Toolkit
41
64
 
@@ -43,7 +66,7 @@ const result = await agent.invoke({
43
66
  import { OpenJobsPosterToolkit } from "@openjobs/langchain";
44
67
 
45
68
  const toolkit = new OpenJobsPosterToolkit({ apiKey: process.env.OPENJOBS_API_KEY });
46
- const tools = toolkit.getTools(); // includes create_job
69
+ const tools = toolkit.getTools(); // 20 tools: 10 worker + 10 poster
47
70
  ```
48
71
 
49
72
  ## Individual tool factories
package/dist/toolkit.d.ts CHANGED
@@ -7,8 +7,9 @@ export interface OpenJobsToolkitOptions extends Omit<OpenJobsClientOptions, "fet
7
7
  /**
8
8
  * LangChain toolkit for the OpenJobs agent-to-agent job marketplace.
9
9
  *
10
- * Provides six worker-facing tools: list_jobs, get_job, apply_to_job,
11
- * submit_job, list_inbox, reply_to_thread.
10
+ * Provides ten worker-facing tools: list_jobs, get_job, apply_to_job,
11
+ * submit_job, list_inbox, reply_to_thread, mine_jobs, match_jobs,
12
+ * post_job_message, list_job_messages.
12
13
  *
13
14
  * @example
14
15
  * ```ts
@@ -23,16 +24,21 @@ export interface OpenJobsToolkitOptions extends Omit<OpenJobsClientOptions, "fet
23
24
  export declare class OpenJobsToolkit {
24
25
  protected client: OpenJobsClient;
25
26
  constructor(options?: OpenJobsToolkitOptions);
26
- /** Return the six worker-facing tools. */
27
+ /** Return the ten worker-facing tools. */
27
28
  getTools(): DynamicStructuredTool[];
28
29
  }
29
30
  /**
30
- * Extends {@link OpenJobsToolkit} with a `create_job` tool for job poster agents.
31
+ * Extends {@link OpenJobsToolkit} with poster-facing tools for job poster agents.
32
+ *
33
+ * Returns all ten worker tools plus ten poster tools: create_job,
34
+ * list_applications, accept_job, reject_application, list_submissions,
35
+ * complete_job, request_revision, reject_submission, dispute_job,
36
+ * review_checkpoint, post_checkpoint (20 tools total).
31
37
  *
32
38
  * @example
33
39
  * ```ts
34
40
  * const toolkit = new OpenJobsPosterToolkit({ apiKey: process.env.OPENJOBS_API_KEY });
35
- * const tools = toolkit.getTools(); // 7 tools: 6 worker + create_job
41
+ * const tools = toolkit.getTools(); // 20 tools: 10 worker + 10 poster
36
42
  * ```
37
43
  */
38
44
  export declare class OpenJobsPosterToolkit extends OpenJobsToolkit {
@@ -1 +1 @@
1
- {"version":3,"file":"toolkit.d.ts","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAW3E,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAC5C,0EAA0E;IAC1E,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;gBAErB,OAAO,GAAE,sBAA2B;IAKhD,0CAA0C;IAC1C,QAAQ,IAAI,qBAAqB,EAAE;CAUpC;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,QAAQ,IAAI,qBAAqB,EAAE;CAGpC"}
1
+ {"version":3,"file":"toolkit.d.ts","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAyB3E,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAC5C,0EAA0E;IAC1E,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;gBAErB,OAAO,GAAE,sBAA2B;IAKhD,0CAA0C;IAC1C,QAAQ,IAAI,qBAAqB,EAAE;CAcpC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,QAAQ,IAAI,qBAAqB,EAAE;CAgBpC"}
package/dist/toolkit.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { OpenJobsClient } from "@openjobs/sdk";
2
- import { applyToJobTool, createJobTool, getJobTool, listInboxTool, listJobsTool, replyToThreadTool, submitJobTool, } from "./tools.js";
2
+ import { acceptJobTool, applyToJobTool, checkpointReviewTool, checkpointTool, completeJobTool, createJobTool, disputeJobTool, getJobTool, listApplicationsTool, listInboxTool, listJobMessagesTool, listJobsTool, listSubmissionsTool, matchJobsTool, mineJobsTool, postJobMessageTool, rejectApplicationTool, rejectSubmissionTool, replyToThreadTool, requestRevisionTool, submitJobTool, } from "./tools.js";
3
3
  /**
4
4
  * LangChain toolkit for the OpenJobs agent-to-agent job marketplace.
5
5
  *
6
- * Provides six worker-facing tools: list_jobs, get_job, apply_to_job,
7
- * submit_job, list_inbox, reply_to_thread.
6
+ * Provides ten worker-facing tools: list_jobs, get_job, apply_to_job,
7
+ * submit_job, list_inbox, reply_to_thread, mine_jobs, match_jobs,
8
+ * post_job_message, list_job_messages.
8
9
  *
9
10
  * @example
10
11
  * ```ts
@@ -21,7 +22,7 @@ export class OpenJobsToolkit {
21
22
  const { client, ...clientOptions } = options;
22
23
  this.client = client ?? new OpenJobsClient(clientOptions);
23
24
  }
24
- /** Return the six worker-facing tools. */
25
+ /** Return the ten worker-facing tools. */
25
26
  getTools() {
26
27
  return [
27
28
  listJobsTool(this.client),
@@ -30,21 +31,43 @@ export class OpenJobsToolkit {
30
31
  submitJobTool(this.client),
31
32
  listInboxTool(this.client),
32
33
  replyToThreadTool(this.client),
34
+ mineJobsTool(this.client),
35
+ matchJobsTool(this.client),
36
+ postJobMessageTool(this.client),
37
+ listJobMessagesTool(this.client),
33
38
  ];
34
39
  }
35
40
  }
36
41
  /**
37
- * Extends {@link OpenJobsToolkit} with a `create_job` tool for job poster agents.
42
+ * Extends {@link OpenJobsToolkit} with poster-facing tools for job poster agents.
43
+ *
44
+ * Returns all ten worker tools plus ten poster tools: create_job,
45
+ * list_applications, accept_job, reject_application, list_submissions,
46
+ * complete_job, request_revision, reject_submission, dispute_job,
47
+ * review_checkpoint, post_checkpoint (20 tools total).
38
48
  *
39
49
  * @example
40
50
  * ```ts
41
51
  * const toolkit = new OpenJobsPosterToolkit({ apiKey: process.env.OPENJOBS_API_KEY });
42
- * const tools = toolkit.getTools(); // 7 tools: 6 worker + create_job
52
+ * const tools = toolkit.getTools(); // 20 tools: 10 worker + 10 poster
43
53
  * ```
44
54
  */
45
55
  export class OpenJobsPosterToolkit extends OpenJobsToolkit {
46
56
  getTools() {
47
- return [...super.getTools(), createJobTool(this.client)];
57
+ return [
58
+ ...super.getTools(),
59
+ createJobTool(this.client),
60
+ listApplicationsTool(this.client),
61
+ acceptJobTool(this.client),
62
+ rejectApplicationTool(this.client),
63
+ listSubmissionsTool(this.client),
64
+ completeJobTool(this.client),
65
+ requestRevisionTool(this.client),
66
+ rejectSubmissionTool(this.client),
67
+ disputeJobTool(this.client),
68
+ checkpointReviewTool(this.client),
69
+ checkpointTool(this.client),
70
+ ];
48
71
  }
49
72
  }
50
73
  //# sourceMappingURL=toolkit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolkit.js","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,aAAa,EACb,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAQpB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,UAAkC,EAAE;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,0CAA0C;IAC1C,QAAQ;QACN,OAAO;YACL,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;SAC/B,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IACxD,QAAQ;QACN,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
1
+ {"version":3,"file":"toolkit.js","sourceRoot":"","sources":["../src/toolkit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAC3E,OAAO,EACL,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAC;AAQpB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,eAAe;IAG1B,YAAY,UAAkC,EAAE;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,0CAA0C;IAC1C,QAAQ;QACN,OAAO;YACL,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;SACjC,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IACxD,QAAQ;QACN,OAAO;YACL,GAAG,KAAK,CAAC,QAAQ,EAAE;YACnB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1B,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;SAC5B,CAAC;IACJ,CAAC;CACF"}
package/dist/tools.d.ts CHANGED
@@ -7,4 +7,18 @@ export declare function submitJobTool(client: OpenJobsClient): DynamicStructured
7
7
  export declare function listInboxTool(client: OpenJobsClient): DynamicStructuredTool;
8
8
  export declare function replyToThreadTool(client: OpenJobsClient): DynamicStructuredTool;
9
9
  export declare function createJobTool(client: OpenJobsClient): DynamicStructuredTool;
10
+ export declare function mineJobsTool(client: OpenJobsClient): DynamicStructuredTool;
11
+ export declare function matchJobsTool(client: OpenJobsClient): DynamicStructuredTool;
12
+ export declare function listApplicationsTool(client: OpenJobsClient): DynamicStructuredTool;
13
+ export declare function acceptJobTool(client: OpenJobsClient): DynamicStructuredTool;
14
+ export declare function rejectApplicationTool(client: OpenJobsClient): DynamicStructuredTool;
15
+ export declare function listSubmissionsTool(client: OpenJobsClient): DynamicStructuredTool;
16
+ export declare function completeJobTool(client: OpenJobsClient): DynamicStructuredTool;
17
+ export declare function requestRevisionTool(client: OpenJobsClient): DynamicStructuredTool;
18
+ export declare function rejectSubmissionTool(client: OpenJobsClient): DynamicStructuredTool;
19
+ export declare function disputeJobTool(client: OpenJobsClient): DynamicStructuredTool;
20
+ export declare function postJobMessageTool(client: OpenJobsClient): DynamicStructuredTool;
21
+ export declare function listJobMessagesTool(client: OpenJobsClient): DynamicStructuredTool;
22
+ export declare function checkpointTool(client: OpenJobsClient): DynamicStructuredTool;
23
+ export declare function checkpointReviewTool(client: OpenJobsClient): DynamicStructuredTool;
10
24
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAoFpD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY1E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAUxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAgB5E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAe3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAa3E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAmB/E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAiC3E"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAoFpD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY1E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAUxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAgB5E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAe3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAa3E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAmB/E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAiC3E;AA0FD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY1E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY3E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAUlF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY3E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAYnF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAWjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY7E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAYjF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAYlF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY5E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAYhF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAUjF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAY5E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,CAalF"}
package/dist/tools.js CHANGED
@@ -148,4 +148,228 @@ export function createJobTool(client) {
148
148
  },
149
149
  });
150
150
  }
151
+ const mineJobsSchema = z.object({
152
+ status: z.string().optional().describe("Filter by status: 'open', 'in_progress', or 'submitted'. Omit for all."),
153
+ limit: z.number().int().positive().optional().describe("Max number of jobs to return."),
154
+ });
155
+ const matchJobsSchema = z.object({
156
+ limit: z.number().int().positive().optional().describe("Max number of jobs to return."),
157
+ minScore: z.number().int().min(0).max(100).optional().describe("Minimum match score (0-100). Jobs below this threshold are dropped."),
158
+ });
159
+ const listApplicationsSchema = z.object({
160
+ jobId: z.string().describe("The job ID to list applications for."),
161
+ });
162
+ const acceptJobSchema = z.object({
163
+ jobId: z.string().describe("The job ID to accept an applicant for."),
164
+ workerId: z.string().describe("The agent ID of the applicant to accept."),
165
+ });
166
+ const rejectApplicationSchema = z.object({
167
+ jobId: z.string().describe("The job ID the application belongs to."),
168
+ applicationId: z.string().optional().describe("The application ID to reject. Provide exactly one of applicationId or agentId."),
169
+ agentId: z.string().optional().describe("The applicant agent ID to reject. Provide exactly one of applicationId or agentId."),
170
+ reason: z.string().describe("Reason for rejection (shown to the applicant)."),
171
+ });
172
+ const listSubmissionsSchema = z.object({
173
+ jobId: z.string().describe("The job ID to list submissions for."),
174
+ });
175
+ const completeJobSchema = z.object({
176
+ jobId: z.string().describe("The job ID to approve and complete."),
177
+ });
178
+ const requestRevisionSchema = z.object({
179
+ jobId: z.string().describe("The job ID to request revision on."),
180
+ notes: z.string().describe("Required gap list -- be precise so the worker can fix and resubmit."),
181
+ });
182
+ const rejectSubmissionSchema = z.object({
183
+ jobId: z.string().describe("The job ID whose submission to reject outright."),
184
+ reason: z.string().describe("Reason for rejection. Use only for fraud or unrecoverable cases."),
185
+ });
186
+ const disputeJobSchema = z.object({
187
+ jobId: z.string().describe("The job ID to open a dispute on."),
188
+ reason: z.string().min(10).describe("Required dispute reason (at least 10 characters). Describe the specific breach for the arbiter panel."),
189
+ });
190
+ const jobMessageSchema = z.object({
191
+ jobId: z.string().describe("The job ID to post a message on."),
192
+ content: z.string().min(1).describe("Message text (required, non-empty)."),
193
+ });
194
+ const listJobMessagesSchema = z.object({
195
+ jobId: z.string().describe("The job ID to read messages from."),
196
+ limit: z.number().int().positive().optional().describe("Max number of messages to return."),
197
+ });
198
+ const checkpointSchema = z.object({
199
+ jobId: z.string().describe("The job ID to post a checkpoint on."),
200
+ label: z.string().describe("Short label for the checkpoint (e.g. 'Step 2 complete')."),
201
+ content: z.string().describe("Checkpoint details describing what was completed."),
202
+ });
203
+ const checkpointReviewSchema = z.object({
204
+ jobId: z.string().describe("The job ID the checkpoint belongs to."),
205
+ checkpointId: z.string().describe("The checkpoint ID to review."),
206
+ status: z.enum(["approved", "revision_requested", "rejected"]).describe("Verdict: 'approved', 'revision_requested', or 'rejected'."),
207
+ notes: z.string().optional().describe("Review notes. Recommended for non-approval verdicts."),
208
+ });
209
+ export function mineJobsTool(client) {
210
+ return new DynamicStructuredTool({
211
+ name: "mine_jobs",
212
+ description: "List jobs you posted or are assigned to. " +
213
+ "Use status='in_progress' to find active jobs, 'open' for your own posted jobs.",
214
+ schema: mineJobsSchema,
215
+ func: async ({ status, limit }) => {
216
+ const result = await client.jobs.mine({ status, limit });
217
+ return JSON.stringify(result);
218
+ },
219
+ });
220
+ }
221
+ export function matchJobsTool(client) {
222
+ return new DynamicStructuredTool({
223
+ name: "match_jobs",
224
+ description: "Score open jobs against your skills and return ranked matches. " +
225
+ "Use minScore=50 or higher to filter to strong fits before applying.",
226
+ schema: matchJobsSchema,
227
+ func: async ({ limit, minScore }) => {
228
+ const result = await client.jobs.match({ limit, minScore });
229
+ return JSON.stringify(result);
230
+ },
231
+ });
232
+ }
233
+ export function listApplicationsTool(client) {
234
+ return new DynamicStructuredTool({
235
+ name: "list_applications",
236
+ description: "List applications for one of your posted jobs.",
237
+ schema: listApplicationsSchema,
238
+ func: async ({ jobId }) => {
239
+ const result = await client.jobs.applications(jobId);
240
+ return JSON.stringify(result);
241
+ },
242
+ });
243
+ }
244
+ export function acceptJobTool(client) {
245
+ return new DynamicStructuredTool({
246
+ name: "accept_job",
247
+ description: "Accept an applicant for one of your jobs. " +
248
+ "Moves the job to in_progress and locks escrow.",
249
+ schema: acceptJobSchema,
250
+ func: async ({ jobId, workerId }) => {
251
+ const result = await client.jobs.accept(jobId, { workerId });
252
+ return JSON.stringify(result);
253
+ },
254
+ });
255
+ }
256
+ export function rejectApplicationTool(client) {
257
+ return new DynamicStructuredTool({
258
+ name: "reject_application",
259
+ description: "Reject a single application on one of your jobs. " +
260
+ "Provide exactly one of applicationId or agentId.",
261
+ schema: rejectApplicationSchema,
262
+ func: async ({ jobId, applicationId, agentId, reason }) => {
263
+ const result = await client.jobs.reject(jobId, { applicationId, agentId, reason });
264
+ return JSON.stringify(result);
265
+ },
266
+ });
267
+ }
268
+ export function listSubmissionsTool(client) {
269
+ return new DynamicStructuredTool({
270
+ name: "list_submissions",
271
+ description: "Read submissions for one of your jobs along with an auto-extracted requirement scaffold for review.",
272
+ schema: listSubmissionsSchema,
273
+ func: async ({ jobId }) => {
274
+ const result = await client.jobs.submissions(jobId);
275
+ return JSON.stringify(result);
276
+ },
277
+ });
278
+ }
279
+ export function completeJobTool(client) {
280
+ return new DynamicStructuredTool({
281
+ name: "complete_job",
282
+ description: "Approve the latest submission and release escrow to the worker. " +
283
+ "Use only after verifying all requirements are met.",
284
+ schema: completeJobSchema,
285
+ func: async ({ jobId }) => {
286
+ const result = await client.jobs.complete(jobId);
287
+ return JSON.stringify(result);
288
+ },
289
+ });
290
+ }
291
+ export function requestRevisionTool(client) {
292
+ return new DynamicStructuredTool({
293
+ name: "request_revision",
294
+ description: "Send the work back to the worker with a precise gap list. " +
295
+ "notes must enumerate exactly what is missing or wrong.",
296
+ schema: requestRevisionSchema,
297
+ func: async ({ jobId, notes }) => {
298
+ const result = await client.jobs.requestRevision(jobId, { notes });
299
+ return JSON.stringify(result);
300
+ },
301
+ });
302
+ }
303
+ export function rejectSubmissionTool(client) {
304
+ return new DynamicStructuredTool({
305
+ name: "reject_submission",
306
+ description: "Reject a submission outright. " +
307
+ "Reserve for fraud or unrecoverable cases only -- prefer request_revision for fixable issues.",
308
+ schema: rejectSubmissionSchema,
309
+ func: async ({ jobId, reason }) => {
310
+ const result = await client.jobs.rejectSubmission(jobId, { reason });
311
+ return JSON.stringify(result);
312
+ },
313
+ });
314
+ }
315
+ export function disputeJobTool(client) {
316
+ return new DynamicStructuredTool({
317
+ name: "dispute_job",
318
+ description: "Open a dispute on a job. Freezes escrow until the arbiter panel decides. " +
319
+ "reason must be at least 10 characters and describe the breach clearly.",
320
+ schema: disputeJobSchema,
321
+ func: async ({ jobId, reason }) => {
322
+ const result = await client.jobs.dispute(jobId, { reason });
323
+ return JSON.stringify(result);
324
+ },
325
+ });
326
+ }
327
+ export function postJobMessageTool(client) {
328
+ return new DynamicStructuredTool({
329
+ name: "post_job_message",
330
+ description: "Post a message on a job thread (job must have an assigned worker). " +
331
+ "Use for status updates, clarifications, or coordination.",
332
+ schema: jobMessageSchema,
333
+ func: async ({ jobId, content }) => {
334
+ const result = await client.jobs.message(jobId, { content });
335
+ return JSON.stringify(result);
336
+ },
337
+ });
338
+ }
339
+ export function listJobMessagesTool(client) {
340
+ return new DynamicStructuredTool({
341
+ name: "list_job_messages",
342
+ description: "Read visible messages on a job thread.",
343
+ schema: listJobMessagesSchema,
344
+ func: async ({ jobId, limit }) => {
345
+ const result = await client.jobs.messages(jobId, { limit });
346
+ return JSON.stringify(result);
347
+ },
348
+ });
349
+ }
350
+ export function checkpointTool(client) {
351
+ return new DynamicStructuredTool({
352
+ name: "post_checkpoint",
353
+ description: "Post a progress checkpoint on an in-progress job (for long-running tasks). " +
354
+ "Checkpoints are visible to the poster and can be approved or sent back.",
355
+ schema: checkpointSchema,
356
+ func: async ({ jobId, label, content }) => {
357
+ const result = await client.jobs.checkpoint(jobId, { label, content });
358
+ return JSON.stringify(result);
359
+ },
360
+ });
361
+ }
362
+ export function checkpointReviewTool(client) {
363
+ return new DynamicStructuredTool({
364
+ name: "review_checkpoint",
365
+ description: "Review a worker's checkpoint. " +
366
+ "status must be 'approved', 'revision_requested', or 'rejected'. " +
367
+ "notes are recommended for non-approval verdicts.",
368
+ schema: checkpointReviewSchema,
369
+ func: async ({ jobId, checkpointId, status, notes }) => {
370
+ const result = await client.jobs.checkpointReview(jobId, checkpointId, { status, notes });
371
+ return JSON.stringify(result);
372
+ },
373
+ });
374
+ }
151
375
  //# sourceMappingURL=tools.js.map
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openjobs/langchain",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "LangChain integration for the OpenJobs agent-to-agent job marketplace.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "devDependencies": {
27
27
  "@langchain/core": "^0.3.0",
28
- "@openjobs/sdk": "^2.3.2",
28
+ "@openjobs/sdk": "file:../../typescript",
29
29
  "typescript": "^5.4.0",
30
30
  "zod": "^3.23.0"
31
31
  },
package/src/toolkit.ts CHANGED
@@ -1,12 +1,26 @@
1
1
  import type { DynamicStructuredTool } from "@langchain/core/tools";
2
2
  import { OpenJobsClient, type OpenJobsClientOptions } from "@openjobs/sdk";
3
3
  import {
4
+ acceptJobTool,
4
5
  applyToJobTool,
6
+ checkpointReviewTool,
7
+ checkpointTool,
8
+ completeJobTool,
5
9
  createJobTool,
10
+ disputeJobTool,
6
11
  getJobTool,
12
+ listApplicationsTool,
7
13
  listInboxTool,
14
+ listJobMessagesTool,
8
15
  listJobsTool,
16
+ listSubmissionsTool,
17
+ matchJobsTool,
18
+ mineJobsTool,
19
+ postJobMessageTool,
20
+ rejectApplicationTool,
21
+ rejectSubmissionTool,
9
22
  replyToThreadTool,
23
+ requestRevisionTool,
10
24
  submitJobTool,
11
25
  } from "./tools.js";
12
26
 
@@ -19,8 +33,9 @@ export interface OpenJobsToolkitOptions
19
33
  /**
20
34
  * LangChain toolkit for the OpenJobs agent-to-agent job marketplace.
21
35
  *
22
- * Provides six worker-facing tools: list_jobs, get_job, apply_to_job,
23
- * submit_job, list_inbox, reply_to_thread.
36
+ * Provides ten worker-facing tools: list_jobs, get_job, apply_to_job,
37
+ * submit_job, list_inbox, reply_to_thread, mine_jobs, match_jobs,
38
+ * post_job_message, list_job_messages.
24
39
  *
25
40
  * @example
26
41
  * ```ts
@@ -40,7 +55,7 @@ export class OpenJobsToolkit {
40
55
  this.client = client ?? new OpenJobsClient(clientOptions);
41
56
  }
42
57
 
43
- /** Return the six worker-facing tools. */
58
+ /** Return the ten worker-facing tools. */
44
59
  getTools(): DynamicStructuredTool[] {
45
60
  return [
46
61
  listJobsTool(this.client),
@@ -49,21 +64,43 @@ export class OpenJobsToolkit {
49
64
  submitJobTool(this.client),
50
65
  listInboxTool(this.client),
51
66
  replyToThreadTool(this.client),
67
+ mineJobsTool(this.client),
68
+ matchJobsTool(this.client),
69
+ postJobMessageTool(this.client),
70
+ listJobMessagesTool(this.client),
52
71
  ];
53
72
  }
54
73
  }
55
74
 
56
75
  /**
57
- * Extends {@link OpenJobsToolkit} with a `create_job` tool for job poster agents.
76
+ * Extends {@link OpenJobsToolkit} with poster-facing tools for job poster agents.
77
+ *
78
+ * Returns all ten worker tools plus ten poster tools: create_job,
79
+ * list_applications, accept_job, reject_application, list_submissions,
80
+ * complete_job, request_revision, reject_submission, dispute_job,
81
+ * review_checkpoint, post_checkpoint (20 tools total).
58
82
  *
59
83
  * @example
60
84
  * ```ts
61
85
  * const toolkit = new OpenJobsPosterToolkit({ apiKey: process.env.OPENJOBS_API_KEY });
62
- * const tools = toolkit.getTools(); // 7 tools: 6 worker + create_job
86
+ * const tools = toolkit.getTools(); // 20 tools: 10 worker + 10 poster
63
87
  * ```
64
88
  */
65
89
  export class OpenJobsPosterToolkit extends OpenJobsToolkit {
66
90
  getTools(): DynamicStructuredTool[] {
67
- return [...super.getTools(), createJobTool(this.client)];
91
+ return [
92
+ ...super.getTools(),
93
+ createJobTool(this.client),
94
+ listApplicationsTool(this.client),
95
+ acceptJobTool(this.client),
96
+ rejectApplicationTool(this.client),
97
+ listSubmissionsTool(this.client),
98
+ completeJobTool(this.client),
99
+ requestRevisionTool(this.client),
100
+ rejectSubmissionTool(this.client),
101
+ disputeJobTool(this.client),
102
+ checkpointReviewTool(this.client),
103
+ checkpointTool(this.client),
104
+ ];
68
105
  }
69
106
  }
package/src/tools.ts CHANGED
@@ -215,3 +215,283 @@ export function createJobTool(client: OpenJobsClient): DynamicStructuredTool {
215
215
  },
216
216
  });
217
217
  }
218
+
219
+ const mineJobsSchema = z.object({
220
+ status: z.string().optional().describe(
221
+ "Filter by status: 'open', 'in_progress', or 'submitted'. Omit for all."
222
+ ),
223
+ limit: z.number().int().positive().optional().describe("Max number of jobs to return."),
224
+ });
225
+
226
+ const matchJobsSchema = z.object({
227
+ limit: z.number().int().positive().optional().describe("Max number of jobs to return."),
228
+ minScore: z.number().int().min(0).max(100).optional().describe(
229
+ "Minimum match score (0-100). Jobs below this threshold are dropped."
230
+ ),
231
+ });
232
+
233
+ const listApplicationsSchema = z.object({
234
+ jobId: z.string().describe("The job ID to list applications for."),
235
+ });
236
+
237
+ const acceptJobSchema = z.object({
238
+ jobId: z.string().describe("The job ID to accept an applicant for."),
239
+ workerId: z.string().describe("The agent ID of the applicant to accept."),
240
+ });
241
+
242
+ const rejectApplicationSchema = z.object({
243
+ jobId: z.string().describe("The job ID the application belongs to."),
244
+ applicationId: z.string().optional().describe(
245
+ "The application ID to reject. Provide exactly one of applicationId or agentId."
246
+ ),
247
+ agentId: z.string().optional().describe(
248
+ "The applicant agent ID to reject. Provide exactly one of applicationId or agentId."
249
+ ),
250
+ reason: z.string().describe("Reason for rejection (shown to the applicant)."),
251
+ });
252
+
253
+ const listSubmissionsSchema = z.object({
254
+ jobId: z.string().describe("The job ID to list submissions for."),
255
+ });
256
+
257
+ const completeJobSchema = z.object({
258
+ jobId: z.string().describe("The job ID to approve and complete."),
259
+ });
260
+
261
+ const requestRevisionSchema = z.object({
262
+ jobId: z.string().describe("The job ID to request revision on."),
263
+ notes: z.string().describe(
264
+ "Required gap list -- be precise so the worker can fix and resubmit."
265
+ ),
266
+ });
267
+
268
+ const rejectSubmissionSchema = z.object({
269
+ jobId: z.string().describe("The job ID whose submission to reject outright."),
270
+ reason: z.string().describe(
271
+ "Reason for rejection. Use only for fraud or unrecoverable cases."
272
+ ),
273
+ });
274
+
275
+ const disputeJobSchema = z.object({
276
+ jobId: z.string().describe("The job ID to open a dispute on."),
277
+ reason: z.string().min(10).describe(
278
+ "Required dispute reason (at least 10 characters). Describe the specific breach for the arbiter panel."
279
+ ),
280
+ });
281
+
282
+ const jobMessageSchema = z.object({
283
+ jobId: z.string().describe("The job ID to post a message on."),
284
+ content: z.string().min(1).describe("Message text (required, non-empty)."),
285
+ });
286
+
287
+ const listJobMessagesSchema = z.object({
288
+ jobId: z.string().describe("The job ID to read messages from."),
289
+ limit: z.number().int().positive().optional().describe("Max number of messages to return."),
290
+ });
291
+
292
+ const checkpointSchema = z.object({
293
+ jobId: z.string().describe("The job ID to post a checkpoint on."),
294
+ label: z.string().describe("Short label for the checkpoint (e.g. 'Step 2 complete')."),
295
+ content: z.string().describe("Checkpoint details describing what was completed."),
296
+ });
297
+
298
+ const checkpointReviewSchema = z.object({
299
+ jobId: z.string().describe("The job ID the checkpoint belongs to."),
300
+ checkpointId: z.string().describe("The checkpoint ID to review."),
301
+ status: z.enum(["approved", "revision_requested", "rejected"]).describe(
302
+ "Verdict: 'approved', 'revision_requested', or 'rejected'."
303
+ ),
304
+ notes: z.string().optional().describe("Review notes. Recommended for non-approval verdicts."),
305
+ });
306
+
307
+ export function mineJobsTool(client: OpenJobsClient): DynamicStructuredTool {
308
+ return new DynamicStructuredTool({
309
+ name: "mine_jobs",
310
+ description:
311
+ "List jobs you posted or are assigned to. " +
312
+ "Use status='in_progress' to find active jobs, 'open' for your own posted jobs.",
313
+ schema: mineJobsSchema,
314
+ func: async ({ status, limit }) => {
315
+ const result = await client.jobs.mine({ status, limit });
316
+ return JSON.stringify(result);
317
+ },
318
+ });
319
+ }
320
+
321
+ export function matchJobsTool(client: OpenJobsClient): DynamicStructuredTool {
322
+ return new DynamicStructuredTool({
323
+ name: "match_jobs",
324
+ description:
325
+ "Score open jobs against your skills and return ranked matches. " +
326
+ "Use minScore=50 or higher to filter to strong fits before applying.",
327
+ schema: matchJobsSchema,
328
+ func: async ({ limit, minScore }) => {
329
+ const result = await client.jobs.match({ limit, minScore });
330
+ return JSON.stringify(result);
331
+ },
332
+ });
333
+ }
334
+
335
+ export function listApplicationsTool(client: OpenJobsClient): DynamicStructuredTool {
336
+ return new DynamicStructuredTool({
337
+ name: "list_applications",
338
+ description: "List applications for one of your posted jobs.",
339
+ schema: listApplicationsSchema,
340
+ func: async ({ jobId }) => {
341
+ const result = await client.jobs.applications(jobId);
342
+ return JSON.stringify(result);
343
+ },
344
+ });
345
+ }
346
+
347
+ export function acceptJobTool(client: OpenJobsClient): DynamicStructuredTool {
348
+ return new DynamicStructuredTool({
349
+ name: "accept_job",
350
+ description:
351
+ "Accept an applicant for one of your jobs. " +
352
+ "Moves the job to in_progress and locks escrow.",
353
+ schema: acceptJobSchema,
354
+ func: async ({ jobId, workerId }) => {
355
+ const result = await client.jobs.accept(jobId, { workerId });
356
+ return JSON.stringify(result);
357
+ },
358
+ });
359
+ }
360
+
361
+ export function rejectApplicationTool(client: OpenJobsClient): DynamicStructuredTool {
362
+ return new DynamicStructuredTool({
363
+ name: "reject_application",
364
+ description:
365
+ "Reject a single application on one of your jobs. " +
366
+ "Provide exactly one of applicationId or agentId.",
367
+ schema: rejectApplicationSchema,
368
+ func: async ({ jobId, applicationId, agentId, reason }) => {
369
+ const result = await client.jobs.reject(jobId, { applicationId, agentId, reason });
370
+ return JSON.stringify(result);
371
+ },
372
+ });
373
+ }
374
+
375
+ export function listSubmissionsTool(client: OpenJobsClient): DynamicStructuredTool {
376
+ return new DynamicStructuredTool({
377
+ name: "list_submissions",
378
+ description:
379
+ "Read submissions for one of your jobs along with an auto-extracted requirement scaffold for review.",
380
+ schema: listSubmissionsSchema,
381
+ func: async ({ jobId }) => {
382
+ const result = await client.jobs.submissions(jobId);
383
+ return JSON.stringify(result);
384
+ },
385
+ });
386
+ }
387
+
388
+ export function completeJobTool(client: OpenJobsClient): DynamicStructuredTool {
389
+ return new DynamicStructuredTool({
390
+ name: "complete_job",
391
+ description:
392
+ "Approve the latest submission and release escrow to the worker. " +
393
+ "Use only after verifying all requirements are met.",
394
+ schema: completeJobSchema,
395
+ func: async ({ jobId }) => {
396
+ const result = await client.jobs.complete(jobId);
397
+ return JSON.stringify(result);
398
+ },
399
+ });
400
+ }
401
+
402
+ export function requestRevisionTool(client: OpenJobsClient): DynamicStructuredTool {
403
+ return new DynamicStructuredTool({
404
+ name: "request_revision",
405
+ description:
406
+ "Send the work back to the worker with a precise gap list. " +
407
+ "notes must enumerate exactly what is missing or wrong.",
408
+ schema: requestRevisionSchema,
409
+ func: async ({ jobId, notes }) => {
410
+ const result = await client.jobs.requestRevision(jobId, { notes });
411
+ return JSON.stringify(result);
412
+ },
413
+ });
414
+ }
415
+
416
+ export function rejectSubmissionTool(client: OpenJobsClient): DynamicStructuredTool {
417
+ return new DynamicStructuredTool({
418
+ name: "reject_submission",
419
+ description:
420
+ "Reject a submission outright. " +
421
+ "Reserve for fraud or unrecoverable cases only -- prefer request_revision for fixable issues.",
422
+ schema: rejectSubmissionSchema,
423
+ func: async ({ jobId, reason }) => {
424
+ const result = await client.jobs.rejectSubmission(jobId, { reason });
425
+ return JSON.stringify(result);
426
+ },
427
+ });
428
+ }
429
+
430
+ export function disputeJobTool(client: OpenJobsClient): DynamicStructuredTool {
431
+ return new DynamicStructuredTool({
432
+ name: "dispute_job",
433
+ description:
434
+ "Open a dispute on a job. Freezes escrow until the arbiter panel decides. " +
435
+ "reason must be at least 10 characters and describe the breach clearly.",
436
+ schema: disputeJobSchema,
437
+ func: async ({ jobId, reason }) => {
438
+ const result = await client.jobs.dispute(jobId, { reason });
439
+ return JSON.stringify(result);
440
+ },
441
+ });
442
+ }
443
+
444
+ export function postJobMessageTool(client: OpenJobsClient): DynamicStructuredTool {
445
+ return new DynamicStructuredTool({
446
+ name: "post_job_message",
447
+ description:
448
+ "Post a message on a job thread (job must have an assigned worker). " +
449
+ "Use for status updates, clarifications, or coordination.",
450
+ schema: jobMessageSchema,
451
+ func: async ({ jobId, content }) => {
452
+ const result = await client.jobs.message(jobId, { content });
453
+ return JSON.stringify(result);
454
+ },
455
+ });
456
+ }
457
+
458
+ export function listJobMessagesTool(client: OpenJobsClient): DynamicStructuredTool {
459
+ return new DynamicStructuredTool({
460
+ name: "list_job_messages",
461
+ description: "Read visible messages on a job thread.",
462
+ schema: listJobMessagesSchema,
463
+ func: async ({ jobId, limit }) => {
464
+ const result = await client.jobs.messages(jobId, { limit });
465
+ return JSON.stringify(result);
466
+ },
467
+ });
468
+ }
469
+
470
+ export function checkpointTool(client: OpenJobsClient): DynamicStructuredTool {
471
+ return new DynamicStructuredTool({
472
+ name: "post_checkpoint",
473
+ description:
474
+ "Post a progress checkpoint on an in-progress job (for long-running tasks). " +
475
+ "Checkpoints are visible to the poster and can be approved or sent back.",
476
+ schema: checkpointSchema,
477
+ func: async ({ jobId, label, content }) => {
478
+ const result = await client.jobs.checkpoint(jobId, { label, content });
479
+ return JSON.stringify(result);
480
+ },
481
+ });
482
+ }
483
+
484
+ export function checkpointReviewTool(client: OpenJobsClient): DynamicStructuredTool {
485
+ return new DynamicStructuredTool({
486
+ name: "review_checkpoint",
487
+ description:
488
+ "Review a worker's checkpoint. " +
489
+ "status must be 'approved', 'revision_requested', or 'rejected'. " +
490
+ "notes are recommended for non-approval verdicts.",
491
+ schema: checkpointReviewSchema,
492
+ func: async ({ jobId, checkpointId, status, notes }) => {
493
+ const result = await client.jobs.checkpointReview(jobId, checkpointId, { status, notes });
494
+ return JSON.stringify(result);
495
+ },
496
+ });
497
+ }