@profullstack/agenticjobs 0.1.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.
Files changed (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/bin/agenticjobs-mcp.mjs +2 -0
  4. package/bin/agenticjobs.mjs +2 -0
  5. package/dist/cli/args.d.ts +17 -0
  6. package/dist/cli/args.js +103 -0
  7. package/dist/cli/args.js.map +1 -0
  8. package/dist/cli/format.d.ts +15 -0
  9. package/dist/cli/format.js +24 -0
  10. package/dist/cli/format.js.map +1 -0
  11. package/dist/cli/index.d.ts +13 -0
  12. package/dist/cli/index.js +620 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli/jobfile.d.ts +15 -0
  15. package/dist/cli/jobfile.js +94 -0
  16. package/dist/cli/jobfile.js.map +1 -0
  17. package/dist/client/client.d.ts +105 -0
  18. package/dist/client/client.js +182 -0
  19. package/dist/client/client.js.map +1 -0
  20. package/dist/client/config.d.ts +33 -0
  21. package/dist/client/config.js +92 -0
  22. package/dist/client/config.js.map +1 -0
  23. package/dist/client/fanout.d.ts +35 -0
  24. package/dist/client/fanout.js +77 -0
  25. package/dist/client/fanout.js.map +1 -0
  26. package/dist/client/index.d.ts +4 -0
  27. package/dist/client/index.js +5 -0
  28. package/dist/client/index.js.map +1 -0
  29. package/dist/client/login.d.ts +23 -0
  30. package/dist/client/login.js +45 -0
  31. package/dist/client/login.js.map +1 -0
  32. package/dist/config.d.ts +40 -0
  33. package/dist/config.js +64 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/core/applications.d.ts +67 -0
  36. package/dist/core/applications.js +187 -0
  37. package/dist/core/applications.js.map +1 -0
  38. package/dist/core/auth.d.ts +120 -0
  39. package/dist/core/auth.js +246 -0
  40. package/dist/core/auth.js.map +1 -0
  41. package/dist/core/import.d.ts +52 -0
  42. package/dist/core/import.js +311 -0
  43. package/dist/core/import.js.map +1 -0
  44. package/dist/core/jobs.d.ts +91 -0
  45. package/dist/core/jobs.js +381 -0
  46. package/dist/core/jobs.js.map +1 -0
  47. package/dist/core/orgs.d.ts +21 -0
  48. package/dist/core/orgs.js +111 -0
  49. package/dist/core/orgs.js.map +1 -0
  50. package/dist/core/resumes.d.ts +51 -0
  51. package/dist/core/resumes.js +144 -0
  52. package/dist/core/resumes.js.map +1 -0
  53. package/dist/core/zip.d.ts +17 -0
  54. package/dist/core/zip.js +77 -0
  55. package/dist/core/zip.js.map +1 -0
  56. package/dist/db/index.d.ts +3 -0
  57. package/dist/db/index.js +3 -0
  58. package/dist/db/index.js.map +1 -0
  59. package/dist/db/migrate.d.ts +15 -0
  60. package/dist/db/migrate.js +67 -0
  61. package/dist/db/migrate.js.map +1 -0
  62. package/dist/db/pool.d.ts +13 -0
  63. package/dist/db/pool.js +68 -0
  64. package/dist/db/pool.js.map +1 -0
  65. package/dist/db/seed.d.ts +9 -0
  66. package/dist/db/seed.js +120 -0
  67. package/dist/db/seed.js.map +1 -0
  68. package/dist/directory/announce.d.ts +32 -0
  69. package/dist/directory/announce.js +59 -0
  70. package/dist/directory/announce.js.map +1 -0
  71. package/dist/directory/federate.d.ts +59 -0
  72. package/dist/directory/federate.js +126 -0
  73. package/dist/directory/federate.js.map +1 -0
  74. package/dist/directory/fetch.d.ts +35 -0
  75. package/dist/directory/fetch.js +138 -0
  76. package/dist/directory/fetch.js.map +1 -0
  77. package/dist/directory/index.d.ts +4 -0
  78. package/dist/directory/index.js +5 -0
  79. package/dist/directory/index.js.map +1 -0
  80. package/dist/directory/registry.d.ts +55 -0
  81. package/dist/directory/registry.js +155 -0
  82. package/dist/directory/registry.js.map +1 -0
  83. package/dist/index.d.ts +14 -0
  84. package/dist/index.js +14 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/markup/escape.d.ts +20 -0
  87. package/dist/markup/escape.js +56 -0
  88. package/dist/markup/escape.js.map +1 -0
  89. package/dist/markup/markdown.d.ts +35 -0
  90. package/dist/markup/markdown.js +279 -0
  91. package/dist/markup/markdown.js.map +1 -0
  92. package/dist/markup/resume.d.ts +72 -0
  93. package/dist/markup/resume.js +260 -0
  94. package/dist/markup/resume.js.map +1 -0
  95. package/dist/mcp/protocol.d.ts +56 -0
  96. package/dist/mcp/protocol.js +48 -0
  97. package/dist/mcp/protocol.js.map +1 -0
  98. package/dist/mcp/server.d.ts +21 -0
  99. package/dist/mcp/server.js +73 -0
  100. package/dist/mcp/server.js.map +1 -0
  101. package/dist/mcp/stdio.d.ts +13 -0
  102. package/dist/mcp/stdio.js +85 -0
  103. package/dist/mcp/stdio.js.map +1 -0
  104. package/dist/mcp/tools.d.ts +26 -0
  105. package/dist/mcp/tools.js +351 -0
  106. package/dist/mcp/tools.js.map +1 -0
  107. package/dist/schema/index.d.ts +5 -0
  108. package/dist/schema/index.js +6 -0
  109. package/dist/schema/index.js.map +1 -0
  110. package/dist/schema/instance.d.ts +85 -0
  111. package/dist/schema/instance.js +147 -0
  112. package/dist/schema/instance.js.map +1 -0
  113. package/dist/schema/job.d.ts +151 -0
  114. package/dist/schema/job.js +73 -0
  115. package/dist/schema/job.js.map +1 -0
  116. package/dist/schema/jsonld.d.ts +18 -0
  117. package/dist/schema/jsonld.js +120 -0
  118. package/dist/schema/jsonld.js.map +1 -0
  119. package/dist/schema/query.d.ts +47 -0
  120. package/dist/schema/query.js +103 -0
  121. package/dist/schema/query.js.map +1 -0
  122. package/dist/schema/text.d.ts +27 -0
  123. package/dist/schema/text.js +117 -0
  124. package/dist/schema/text.js.map +1 -0
  125. package/dist/server/app.d.ts +13 -0
  126. package/dist/server/app.js +57 -0
  127. package/dist/server/app.js.map +1 -0
  128. package/dist/server/deps.d.ts +20 -0
  129. package/dist/server/deps.js +2 -0
  130. package/dist/server/deps.js.map +1 -0
  131. package/dist/server/middleware.d.ts +39 -0
  132. package/dist/server/middleware.js +100 -0
  133. package/dist/server/middleware.js.map +1 -0
  134. package/dist/server/routes/api.d.ts +20 -0
  135. package/dist/server/routes/api.js +584 -0
  136. package/dist/server/routes/api.js.map +1 -0
  137. package/dist/server/routes/descriptor.d.ts +11 -0
  138. package/dist/server/routes/descriptor.js +31 -0
  139. package/dist/server/routes/descriptor.js.map +1 -0
  140. package/dist/server/routes/discovery.d.ts +12 -0
  141. package/dist/server/routes/discovery.js +305 -0
  142. package/dist/server/routes/discovery.js.map +1 -0
  143. package/dist/server/routes/mcp.d.ts +19 -0
  144. package/dist/server/routes/mcp.js +85 -0
  145. package/dist/server/routes/mcp.js.map +1 -0
  146. package/dist/server/routes/openapi.d.ts +11 -0
  147. package/dist/server/routes/openapi.js +297 -0
  148. package/dist/server/routes/openapi.js.map +1 -0
  149. package/dist/server/routes/pages.d.ts +11 -0
  150. package/dist/server/routes/pages.js +445 -0
  151. package/dist/server/routes/pages.js.map +1 -0
  152. package/dist/server/routes/passkey.d.ts +20 -0
  153. package/dist/server/routes/passkey.js +198 -0
  154. package/dist/server/routes/passkey.js.map +1 -0
  155. package/dist/server/routes/specs.d.ts +10 -0
  156. package/dist/server/routes/specs.js +42 -0
  157. package/dist/server/routes/specs.js.map +1 -0
  158. package/dist/server/serve.d.ts +11 -0
  159. package/dist/server/serve.js +79 -0
  160. package/dist/server/serve.js.map +1 -0
  161. package/dist/tui/index.d.ts +13 -0
  162. package/dist/tui/index.js +266 -0
  163. package/dist/tui/index.js.map +1 -0
  164. package/dist/tui/state.d.ts +63 -0
  165. package/dist/tui/state.js +136 -0
  166. package/dist/tui/state.js.map +1 -0
  167. package/dist/tui/types.d.ts +2 -0
  168. package/dist/tui/types.js +2 -0
  169. package/dist/tui/types.js.map +1 -0
  170. package/dist/tui/views.d.ts +11 -0
  171. package/dist/tui/views.js +197 -0
  172. package/dist/tui/views.js.map +1 -0
  173. package/dist/views/auth.d.ts +21 -0
  174. package/dist/views/auth.js +5 -0
  175. package/dist/views/auth.js.map +1 -0
  176. package/dist/views/docs.d.ts +17 -0
  177. package/dist/views/docs.js +40 -0
  178. package/dist/views/docs.js.map +1 -0
  179. package/dist/views/jobs.d.ts +49 -0
  180. package/dist/views/jobs.js +44 -0
  181. package/dist/views/jobs.js.map +1 -0
  182. package/dist/views/layout.d.ts +58 -0
  183. package/dist/views/layout.js +36 -0
  184. package/dist/views/layout.js.map +1 -0
  185. package/dist/views/me.d.ts +27 -0
  186. package/dist/views/me.js +6 -0
  187. package/dist/views/me.js.map +1 -0
  188. package/dist/views/network.d.ts +21 -0
  189. package/dist/views/network.js +17 -0
  190. package/dist/views/network.js.map +1 -0
  191. package/dist/views/post.d.ts +22 -0
  192. package/dist/views/post.js +20 -0
  193. package/dist/views/post.js.map +1 -0
  194. package/docs/openjob.md +200 -0
  195. package/docs/openresume.md +143 -0
  196. package/migrations/0001_init.sql +109 -0
  197. package/migrations/0002_auth.sql +82 -0
  198. package/migrations/0003_directory.sql +27 -0
  199. package/migrations/0004_resumes.sql +63 -0
  200. package/migrations/0005_application_drafts.sql +20 -0
  201. package/package.json +92 -0
  202. package/web/public/app.css +731 -0
  203. package/web/public/app.js +173 -0
  204. package/web/public/icon.svg +5 -0
  205. package/web/public/sw.js +64 -0
  206. package/web/public/tokens.css +153 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The tools.
3
+ *
4
+ * Every one of them calls the board's REST API. None of them touch the
5
+ * database, even when running inside the server, because a second read path
6
+ * gets its own permission bugs - the tool would be checking a rule the API
7
+ * checks differently, and the two would drift apart on the first change.
8
+ *
9
+ * `Caller` is the only thing that differs between the two hosts: inside the
10
+ * server it dispatches through the app's own fetch, and in the stdio binary it
11
+ * is an ordinary HTTP client pointed at a remote board.
12
+ */
13
+ import { type ToolDefinition, type ToolResult } from './protocol.ts';
14
+ export interface Caller {
15
+ /** Path is relative to the board root, e.g. `/api/v1/jobs?q=rust`. */
16
+ call(method: 'GET' | 'POST' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<{
17
+ status: number;
18
+ body: unknown;
19
+ }>;
20
+ /** The board this caller talks to, for messages. */
21
+ server: string;
22
+ /** Whether a token is configured, so tools can say what is missing. */
23
+ authenticated: boolean;
24
+ }
25
+ export declare const TOOLS: ToolDefinition[];
26
+ export declare function callTool(caller: Caller, name: string, args: Record<string, unknown>): Promise<ToolResult>;
@@ -0,0 +1,351 @@
1
+ /**
2
+ * The tools.
3
+ *
4
+ * Every one of them calls the board's REST API. None of them touch the
5
+ * database, even when running inside the server, because a second read path
6
+ * gets its own permission bugs - the tool would be checking a rule the API
7
+ * checks differently, and the two would drift apart on the first change.
8
+ *
9
+ * `Caller` is the only thing that differs between the two hosts: inside the
10
+ * server it dispatches through the app's own fetch, and in the stdio binary it
11
+ * is an ordinary HTTP client pointed at a remote board.
12
+ */
13
+ import { text, toolError } from "./protocol.js";
14
+ function object(properties, required = []) {
15
+ return { type: 'object', properties, required, additionalProperties: false };
16
+ }
17
+ const string = (description) => ({ type: 'string', description });
18
+ const integer = (description) => ({
19
+ type: 'integer',
20
+ description,
21
+ });
22
+ export const TOOLS = [
23
+ {
24
+ name: 'search_jobs',
25
+ title: 'Search jobs',
26
+ description: 'Search this board. Every listing was posted here by its employer, so an empty result means nobody has posted that job - not that a crawler missed it. Filter on agentPolicy to find employers who welcome agent-written applications.',
27
+ inputSchema: object({
28
+ q: string('Free text over title, description, tags and stack.'),
29
+ workplace: { type: 'string', enum: ['remote', 'hybrid', 'onsite'] },
30
+ employmentType: {
31
+ type: 'string',
32
+ enum: ['full-time', 'part-time', 'contract', 'internship', 'temporary'],
33
+ },
34
+ seniority: {
35
+ type: 'string',
36
+ enum: ['intern', 'junior', 'mid', 'senior', 'staff', 'principal', 'lead'],
37
+ },
38
+ agentPolicy: {
39
+ type: 'string',
40
+ enum: ['welcome', 'disclose', 'human-only'],
41
+ description: 'Where the employer stands on applications written with an agent.',
42
+ },
43
+ tag: string('One tag or several, comma separated. Matches tags and stack.'),
44
+ salaryMin: integer('Minimum, compared against the top of each range.'),
45
+ limit: integer('1-100, default 25.'),
46
+ offset: integer('For paging.'),
47
+ }),
48
+ },
49
+ {
50
+ name: 'get_job',
51
+ title: 'Read one job',
52
+ description: 'The full listing, its description as Markdown, and its schema.org JSON-LD.',
53
+ inputSchema: object({ slug: string('The job slug.') }, ['slug']),
54
+ },
55
+ {
56
+ name: 'get_apply_schema',
57
+ title: 'How to apply',
58
+ description: 'The exact fields this job wants, where to send them, and whether the employer asks agent-written applications to disclose. Always call this before apply_to_job.',
59
+ inputSchema: object({ slug: string('The job slug.') }, ['slug']),
60
+ },
61
+ {
62
+ name: 'apply_to_job',
63
+ title: 'Apply to a job',
64
+ description: 'Send an application. Fill in the fields get_apply_schema listed. Pass the resume as Markdown in the OpenResume.md convention. If the employer asks for disclosure, say which agent wrote it - disclosing is not held against a candidate on a board that asked for it.',
65
+ inputSchema: object({
66
+ slug: string('The job slug.'),
67
+ answers: {
68
+ type: 'object',
69
+ description: 'The fields from get_apply_schema, keyed by field name.',
70
+ additionalProperties: { type: 'string' },
71
+ },
72
+ resume: string('The resume, as Markdown.'),
73
+ resumeSlug: string('Or the slug of a resume already saved on this board.'),
74
+ agentName: string('Which agent wrote this, if one did.'),
75
+ agentSupervised: {
76
+ type: 'boolean',
77
+ description: 'Whether a person read it before it was sent.',
78
+ },
79
+ }, ['slug', 'answers']),
80
+ },
81
+ {
82
+ name: 'list_employers',
83
+ title: 'List employers',
84
+ description: 'Everyone with an open listing on this board.',
85
+ inputSchema: object({}),
86
+ },
87
+ {
88
+ name: 'whoami',
89
+ title: 'Who am I',
90
+ description: 'The account this connection is signed in as, with the employers it can post under and the resumes it has saved.',
91
+ inputSchema: object({}),
92
+ },
93
+ {
94
+ name: 'list_resumes',
95
+ title: 'List saved resumes',
96
+ description: 'The resumes on this account, as Markdown.',
97
+ inputSchema: object({}),
98
+ },
99
+ {
100
+ name: 'save_resume',
101
+ title: 'Save a resume',
102
+ description: 'Create or replace a resume. Markdown, in the OpenResume.md convention: an h1 with the name, a bullet list of contact details, then ## sections and ### entries.',
103
+ inputSchema: object({
104
+ markdown: string('The resume, as Markdown.'),
105
+ title: string('What to call it. Defaults to the name in the document.'),
106
+ slug: string('Replace an existing resume with this slug, instead of creating one.'),
107
+ }, ['markdown']),
108
+ },
109
+ {
110
+ name: 'post_job',
111
+ title: 'Post a job',
112
+ description: 'Create a listing. It stays a draft until publish_job is called, so nothing goes live without someone asking for it. Requires membership of the employer.',
113
+ inputSchema: object({
114
+ org: string('The employer slug to post under.'),
115
+ title: string('The role.'),
116
+ description: string('The listing body, as Markdown.'),
117
+ employmentType: { type: 'string', enum: ['full-time', 'part-time', 'contract', 'internship', 'temporary'] },
118
+ workplace: { type: 'string', enum: ['remote', 'hybrid', 'onsite'] },
119
+ seniority: { type: 'string', enum: ['intern', 'junior', 'mid', 'senior', 'staff', 'principal', 'lead'] },
120
+ location: string('Free text.'),
121
+ salaryMin: integer('Bottom of the range.'),
122
+ salaryMax: integer('Top of the range.'),
123
+ salaryCurrency: string('ISO code, e.g. USD.'),
124
+ salaryPeriod: { type: 'string', enum: ['hour', 'day', 'week', 'month', 'year'] },
125
+ tags: string('Comma separated.'),
126
+ stack: string('Comma separated.'),
127
+ agentPolicy: {
128
+ type: 'string',
129
+ enum: ['welcome', 'disclose', 'human-only'],
130
+ description: 'Required on every listing. Defaults to disclose.',
131
+ },
132
+ }, ['org', 'title', 'description']),
133
+ },
134
+ {
135
+ name: 'publish_job',
136
+ title: 'Publish a job',
137
+ description: 'Take a draft live. Requires membership of the employer.',
138
+ inputSchema: object({ slug: string('The job slug.') }, ['slug']),
139
+ },
140
+ {
141
+ name: 'list_applications',
142
+ title: 'Read applications',
143
+ description: 'Applications to one of your listings, including each candidate resume and any agent disclosure.',
144
+ inputSchema: object({ slug: string('The job slug.') }, ['slug']),
145
+ },
146
+ {
147
+ name: 'search_network',
148
+ title: 'Search every board',
149
+ description: 'One search across every board listed in this instance directory, in parallel. Results say which board each came from; a board that failed to answer is named rather than silently dropped. Only works on an instance that is a directory.',
150
+ inputSchema: object({
151
+ q: string('Free text.'),
152
+ workplace: { type: 'string', enum: ['remote', 'hybrid', 'onsite'] },
153
+ agentPolicy: { type: 'string', enum: ['welcome', 'disclose', 'human-only'] },
154
+ limit: integer('1-100, default 25.'),
155
+ }),
156
+ },
157
+ {
158
+ name: 'list_instances',
159
+ title: 'List boards',
160
+ description: 'Every board this instance directory knows about. Directories only.',
161
+ inputSchema: object({ topic: string('Filter by topic.') }),
162
+ },
163
+ ];
164
+ function query(args, keys) {
165
+ const params = new URLSearchParams();
166
+ for (const key of keys) {
167
+ const value = args[key];
168
+ if (value === undefined || value === null || value === '')
169
+ continue;
170
+ if (key === 'tag') {
171
+ for (const tag of String(value).split(',')) {
172
+ const trimmed = tag.trim();
173
+ if (trimmed !== '')
174
+ params.append('tag', trimmed);
175
+ }
176
+ continue;
177
+ }
178
+ params.set(key, String(value));
179
+ }
180
+ const search = params.toString();
181
+ return search === '' ? '' : `?${search}`;
182
+ }
183
+ function message(body, fallback) {
184
+ if (typeof body === 'object' && body !== null && 'error' in body) {
185
+ const error = body.error;
186
+ if (typeof error?.message === 'string')
187
+ return error.message;
188
+ }
189
+ return fallback;
190
+ }
191
+ export async function callTool(caller, name, args) {
192
+ switch (name) {
193
+ case 'search_jobs': {
194
+ const path = `/api/v1/jobs${query(args, [
195
+ 'q',
196
+ 'workplace',
197
+ 'employmentType',
198
+ 'seniority',
199
+ 'agentPolicy',
200
+ 'tag',
201
+ 'salaryMin',
202
+ 'limit',
203
+ 'offset',
204
+ ])}`;
205
+ const response = await caller.call('GET', path);
206
+ if (response.status !== 200)
207
+ return toolError(message(response.body, 'Search failed.'));
208
+ const page = response.body;
209
+ const items = page.items ?? [];
210
+ if (items.length === 0) {
211
+ return text(`No jobs on ${caller.server} match that. This board only holds listings posted to it, so nothing matched rather than nothing was found.`, response.body);
212
+ }
213
+ return text(summarise(items, page.total ?? items.length, caller.server), response.body);
214
+ }
215
+ case 'get_job': {
216
+ const response = await caller.call('GET', `/api/v1/jobs/${encodeURIComponent(String(args['slug'] ?? ''))}`);
217
+ if (response.status !== 200)
218
+ return toolError(message(response.body, 'No such job.'));
219
+ return text(describeJob(response.body), response.body);
220
+ }
221
+ case 'get_apply_schema': {
222
+ const response = await caller.call('GET', `/api/v1/jobs/${encodeURIComponent(String(args['slug'] ?? ''))}/apply-schema`);
223
+ if (response.status !== 200)
224
+ return toolError(message(response.body, 'No such job.'));
225
+ return text(JSON.stringify(response.body, null, 2), response.body);
226
+ }
227
+ case 'apply_to_job': {
228
+ const answers = typeof args['answers'] === 'object' && args['answers'] !== null
229
+ ? args['answers']
230
+ : {};
231
+ const body = { ...answers };
232
+ if (typeof args['resume'] === 'string')
233
+ body['resume'] = args['resume'];
234
+ if (typeof args['resumeSlug'] === 'string')
235
+ body['resumeSlug'] = args['resumeSlug'];
236
+ if (typeof args['agentName'] === 'string' && args['agentName'] !== '') {
237
+ body['agent'] = { name: args['agentName'], supervised: args['agentSupervised'] === true };
238
+ }
239
+ const response = await caller.call('POST', `/api/v1/jobs/${encodeURIComponent(String(args['slug'] ?? ''))}/apply`, body);
240
+ if (response.status !== 201) {
241
+ const fields = response.body
242
+ .error?.fields;
243
+ const detail = fields === undefined
244
+ ? ''
245
+ : `\n\n${fields.map((problem) => `- ${problem.field}: ${problem.message}`).join('\n')}`;
246
+ return toolError(`${message(response.body, 'The application was not accepted.')}${detail}`);
247
+ }
248
+ return text('Application sent.', response.body);
249
+ }
250
+ case 'list_employers': {
251
+ const response = await caller.call('GET', '/api/v1/orgs');
252
+ return text(JSON.stringify(response.body, null, 2), response.body);
253
+ }
254
+ case 'whoami': {
255
+ const response = await caller.call('GET', '/api/v1/me');
256
+ if (response.status === 401) {
257
+ return toolError(caller.authenticated
258
+ ? `The token for ${caller.server} has expired. Run: agenticjobs login ${caller.server}`
259
+ : `Not signed in to ${caller.server}. Run: agenticjobs login ${caller.server}`);
260
+ }
261
+ return text(JSON.stringify(response.body, null, 2), response.body);
262
+ }
263
+ case 'list_resumes': {
264
+ const response = await caller.call('GET', '/api/v1/resumes');
265
+ if (response.status === 401)
266
+ return toolError(signInFirst(caller));
267
+ return text(JSON.stringify(response.body, null, 2), response.body);
268
+ }
269
+ case 'save_resume': {
270
+ const slug = args['slug'];
271
+ const body = {
272
+ markdown: String(args['markdown'] ?? ''),
273
+ ...(typeof args['title'] === 'string' ? { title: args['title'] } : {}),
274
+ };
275
+ const response = typeof slug === 'string' && slug !== ''
276
+ ? await caller.call('PATCH', `/api/v1/resumes/${encodeURIComponent(slug)}`, body)
277
+ : await caller.call('POST', '/api/v1/resumes', body);
278
+ if (response.status === 401)
279
+ return toolError(signInFirst(caller));
280
+ if (response.status >= 400)
281
+ return toolError(message(response.body, 'The resume was not saved.'));
282
+ return text('Saved.', response.body);
283
+ }
284
+ case 'post_job': {
285
+ const response = await caller.call('POST', '/api/v1/jobs', args);
286
+ if (response.status === 401)
287
+ return toolError(signInFirst(caller));
288
+ if (response.status !== 201)
289
+ return toolError(message(response.body, 'The job was not created.'));
290
+ const created = response.body.job;
291
+ return text(`Created as a draft: ${created?.slug ?? 'unknown'}. It is not visible to anyone until publish_job is called.`, response.body);
292
+ }
293
+ case 'publish_job': {
294
+ const response = await caller.call('POST', `/api/v1/jobs/${encodeURIComponent(String(args['slug'] ?? ''))}/publish`);
295
+ if (response.status === 401)
296
+ return toolError(signInFirst(caller));
297
+ if (response.status >= 400)
298
+ return toolError(message(response.body, 'The job was not published.'));
299
+ return text('Published.', response.body);
300
+ }
301
+ case 'list_applications': {
302
+ const response = await caller.call('GET', `/api/v1/jobs/${encodeURIComponent(String(args['slug'] ?? ''))}/applications`);
303
+ if (response.status === 401)
304
+ return toolError(signInFirst(caller));
305
+ if (response.status >= 400)
306
+ return toolError(message(response.body, 'Could not read applications.'));
307
+ return text(JSON.stringify(response.body, null, 2), response.body);
308
+ }
309
+ case 'search_network': {
310
+ const response = await caller.call('GET', `/api/v1/directory/search${query(args, ['q', 'workplace', 'agentPolicy', 'limit'])}`);
311
+ if (response.status === 404) {
312
+ return toolError(`${caller.server} is a board, not a directory, so it has no network to search.`);
313
+ }
314
+ const result = response.body;
315
+ const failed = (result.sources ?? []).filter((source) => !source.ok);
316
+ const lines = (result.jobs ?? []).map((entry) => `- ${entry.job.title} (${entry.instanceName}) ${entry.url}`);
317
+ const note = failed.length === 0
318
+ ? ''
319
+ : `\n\n${failed.length} board(s) did not answer, so their listings are missing: ${failed.map((source) => source.name).join(', ')}.`;
320
+ return text(lines.length === 0 ? `Nothing matched on any listed board.${note}` : `${lines.join('\n')}${note}`, response.body);
321
+ }
322
+ case 'list_instances': {
323
+ const response = await caller.call('GET', `/api/v1/directory/instances${query(args, ['topic'])}`);
324
+ if (response.status === 404)
325
+ return toolError(`${caller.server} is not a directory.`);
326
+ return text(JSON.stringify(response.body, null, 2), response.body);
327
+ }
328
+ default:
329
+ return toolError(`No tool called ${name}.`);
330
+ }
331
+ }
332
+ function signInFirst(caller) {
333
+ return `That needs an account on ${caller.server}. Run: agenticjobs login ${caller.server}`;
334
+ }
335
+ function summarise(items, total, server) {
336
+ const lines = items.map((item) => {
337
+ const job = item;
338
+ const pay = job.salary?.max !== null && job.salary?.max !== undefined
339
+ ? ` - ${job.salary.currency ?? 'USD'} ${job.salary.min ?? ''}-${job.salary.max}`
340
+ : '';
341
+ return `- ${job.title ?? 'Untitled'} at ${job.org?.name ?? 'unknown'} (${job.workplace ?? '?'}${job.location ? `, ${job.location}` : ''})${pay} [${job.agentPolicy ?? '?'}] ${server}/jobs/${job.slug ?? ''}`;
342
+ });
343
+ return `${total} match on ${server}, showing ${items.length}:\n\n${lines.join('\n')}`;
344
+ }
345
+ function describeJob(body) {
346
+ const job = body.job;
347
+ if (job === undefined)
348
+ return JSON.stringify(body, null, 2);
349
+ return JSON.stringify(job, null, 2);
350
+ }
351
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './job.ts';
2
+ export * from './query.ts';
3
+ export * from './text.ts';
4
+ export * from './jsonld.ts';
5
+ export * from './instance.ts';
@@ -0,0 +1,6 @@
1
+ export * from "./job.js";
2
+ export * from "./query.js";
3
+ export * from "./text.js";
4
+ export * from "./jsonld.js";
5
+ export * from "./instance.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The federation contract.
3
+ *
4
+ * Every instance serves a descriptor at `/.well-known/agenticjobs`, and that
5
+ * one document is how a directory lists it, how a client decides it is talking
6
+ * to a job board at all, and how one instance searches another. Adding a field
7
+ * here is additive; a client must ignore what it does not recognise, because
8
+ * instances upgrade on their owners' schedules and never together.
9
+ */
10
+ /** Bumped only for a change that would break an older reader. */
11
+ export declare const PROTOCOL_VERSION = 1;
12
+ export declare const WELL_KNOWN_PATH = "/.well-known/agenticjobs";
13
+ export interface InstanceDescriptor {
14
+ protocol: number;
15
+ /** The instance's own public origin. Everything else is relative to it. */
16
+ url: string;
17
+ name: string;
18
+ tagline: string;
19
+ /** Free-form, lowercase. How a directory groups instances. */
20
+ topics: string[];
21
+ software: {
22
+ name: string;
23
+ version: string;
24
+ };
25
+ /** Published counts, so a client can rank instances before querying them. */
26
+ jobs: {
27
+ open: number;
28
+ total: number;
29
+ };
30
+ endpoints: {
31
+ /** Where a JobQuery goes. */
32
+ search: string;
33
+ openapi: string;
34
+ /** Streamable HTTP MCP. */
35
+ mcp: string;
36
+ feed: string;
37
+ };
38
+ /** Whether this instance also runs a directory others can announce to. */
39
+ directory: boolean;
40
+ /** Optional, for a human to write to. */
41
+ contact: string | null;
42
+ }
43
+ /**
44
+ * What the directory stores.
45
+ *
46
+ * `updatedAt` is set from the directory's own clock at the moment it last
47
+ * successfully read the instance, never from anything the instance sent.
48
+ */
49
+ export interface InstanceListing {
50
+ id: string;
51
+ url: string;
52
+ descriptor: InstanceDescriptor;
53
+ /** Last time the directory fetched the descriptor and it answered. */
54
+ updatedAt: string;
55
+ /** First time this URL was ever seen. Survives an instance going quiet. */
56
+ firstSeenAt: string;
57
+ /** Consecutive failed fetches. Reset to 0 by any success. */
58
+ failures: number;
59
+ online: boolean;
60
+ }
61
+ /** How long an instance stays `online` without a successful re-check. */
62
+ export declare const ONLINE_TTL_MS: number;
63
+ /** How often an instance re-announces itself. Comfortably inside the TTL. */
64
+ export declare const HEARTBEAT_MS: number;
65
+ /** Dropped from the directory after this many consecutive failures. */
66
+ export declare const MAX_FAILURES = 48;
67
+ export declare const DEFAULT_DIRECTORY = "https://agenticjobs.work";
68
+ /**
69
+ * A URL the directory is willing to list.
70
+ *
71
+ * It has to be somewhere another person's browser can actually go. A loopback
72
+ * or link-local address is only reachable from the machine that published it,
73
+ * so listing one produces an entry nobody but its owner can ever open — and,
74
+ * because the directory fetches the URL itself, accepting one would also point
75
+ * the directory's own HTTP client at its own network.
76
+ */
77
+ export declare function publishable(raw: string): URL | null;
78
+ /**
79
+ * Validate a descriptor fetched from an instance.
80
+ *
81
+ * Everything here arrived over the network from a stranger, so the URL is
82
+ * taken from where we fetched it rather than from what the document claims,
83
+ * and every string is flattened before it can reach a terminal or a page.
84
+ */
85
+ export declare function parseDescriptor(input: unknown, fetchedFrom: string): InstanceDescriptor | null;