@profullstack/agenticjobs 0.12.0 → 0.14.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 (92) hide show
  1. package/README.md +70 -1
  2. package/dist/cli/args.js +1 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/index.js +78 -5
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/client/client.d.ts +44 -0
  7. package/dist/client/client.js +19 -0
  8. package/dist/client/client.js.map +1 -1
  9. package/dist/config.d.ts +1 -1
  10. package/dist/config.js +1 -1
  11. package/dist/core/agentwriter.js +22 -5
  12. package/dist/core/agentwriter.js.map +1 -1
  13. package/dist/core/applications.js +1 -1
  14. package/dist/core/applications.js.map +1 -1
  15. package/dist/core/import.js +10 -2
  16. package/dist/core/import.js.map +1 -1
  17. package/dist/core/jobs.d.ts +24 -6
  18. package/dist/core/jobs.js +116 -31
  19. package/dist/core/jobs.js.map +1 -1
  20. package/dist/core/recommendations.d.ts +134 -0
  21. package/dist/core/recommendations.js +356 -0
  22. package/dist/core/recommendations.js.map +1 -0
  23. package/dist/core/updates.d.ts +15 -3
  24. package/dist/core/updates.js +58 -24
  25. package/dist/core/updates.js.map +1 -1
  26. package/dist/core/zip.js +29 -4
  27. package/dist/core/zip.js.map +1 -1
  28. package/dist/directory/federate.js +3 -1
  29. package/dist/directory/federate.js.map +1 -1
  30. package/dist/directory/fetch.d.ts +1 -1
  31. package/dist/markup/markdown.js +2 -1
  32. package/dist/markup/markdown.js.map +1 -1
  33. package/dist/markup/resume.js +18 -5
  34. package/dist/markup/resume.js.map +1 -1
  35. package/dist/mcp/tools.js +99 -7
  36. package/dist/mcp/tools.js.map +1 -1
  37. package/dist/schema/index.d.ts +1 -0
  38. package/dist/schema/index.js +1 -0
  39. package/dist/schema/index.js.map +1 -1
  40. package/dist/schema/instance.js +29 -0
  41. package/dist/schema/instance.js.map +1 -1
  42. package/dist/schema/job.d.ts +12 -0
  43. package/dist/schema/job.js +17 -3
  44. package/dist/schema/job.js.map +1 -1
  45. package/dist/schema/jsonld.js +7 -6
  46. package/dist/schema/jsonld.js.map +1 -1
  47. package/dist/schema/pay.d.ts +173 -0
  48. package/dist/schema/pay.js +668 -0
  49. package/dist/schema/pay.js.map +1 -0
  50. package/dist/server/app.js +3 -1
  51. package/dist/server/app.js.map +1 -1
  52. package/dist/server/middleware.d.ts +11 -1
  53. package/dist/server/middleware.js +18 -3
  54. package/dist/server/middleware.js.map +1 -1
  55. package/dist/server/routes/api.js +153 -7
  56. package/dist/server/routes/api.js.map +1 -1
  57. package/dist/server/routes/discovery.js +10 -8
  58. package/dist/server/routes/discovery.js.map +1 -1
  59. package/dist/server/routes/openapi.js +136 -2
  60. package/dist/server/routes/openapi.js.map +1 -1
  61. package/dist/server/routes/pages.js +155 -14
  62. package/dist/server/routes/pages.js.map +1 -1
  63. package/dist/tui/views.js +9 -3
  64. package/dist/tui/views.js.map +1 -1
  65. package/dist/views/candidates.d.ts +6 -0
  66. package/dist/views/candidates.js +2 -1
  67. package/dist/views/candidates.js.map +1 -1
  68. package/dist/views/inbox.js +6 -6
  69. package/dist/views/inbox.js.map +1 -1
  70. package/dist/views/jobs.d.ts +16 -0
  71. package/dist/views/jobs.js +33 -11
  72. package/dist/views/jobs.js.map +1 -1
  73. package/dist/views/layout.d.ts +22 -0
  74. package/dist/views/layout.js +18 -0
  75. package/dist/views/layout.js.map +1 -1
  76. package/dist/views/me.d.ts +7 -0
  77. package/dist/views/me.js +3 -2
  78. package/dist/views/me.js.map +1 -1
  79. package/dist/views/post.d.ts +18 -0
  80. package/dist/views/post.js +39 -7
  81. package/dist/views/post.js.map +1 -1
  82. package/dist/views/recommendations.d.ts +43 -0
  83. package/dist/views/recommendations.js +26 -0
  84. package/dist/views/recommendations.js.map +1 -0
  85. package/dist/views/updates.js +5 -5
  86. package/dist/views/updates.js.map +1 -1
  87. package/docs/openjob.md +63 -0
  88. package/migrations/0015_pay_lines.sql +38 -0
  89. package/migrations/0016_recommendations.sql +65 -0
  90. package/package.json +1 -1
  91. package/web/public/app.css +60 -5
  92. package/web/public/sw.js +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/views/post.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/views/post.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Recommendations: the ones on a page, the form that writes one, and the
3
+ * section of /me where they are approved or rejected.
4
+ *
5
+ * A recommendation is plain text or Markdown, rendered the way every other
6
+ * body on the board is. It carries a name and a link to the page that name
7
+ * has, because a paragraph nobody signed is a review, and this is not a review.
8
+ */
9
+ import type { FC } from 'hono/jsx';
10
+ import type { Recommendation } from '../core/recommendations.ts';
11
+ export declare const RecommendationItem: FC<{
12
+ item: Recommendation;
13
+ showSubject?: boolean;
14
+ }>;
15
+ /** The approved ones, on a candidate's or an employer's page. */
16
+ export declare const RecommendationList: FC<{
17
+ items: Recommendation[];
18
+ about: string;
19
+ }>;
20
+ /**
21
+ * The form on a page, for a signed-in reader who is not the subject.
22
+ *
23
+ * `existing` is what this reader already wrote, so the form is a rewrite
24
+ * rather than a second copy, and says what state the earlier one is in.
25
+ */
26
+ export interface RecommendFormProps {
27
+ action: string;
28
+ asOptions: {
29
+ slug: string;
30
+ name: string;
31
+ }[];
32
+ canWriteAsSelf: boolean;
33
+ existing: Recommendation | null;
34
+ values?: Record<string, string>;
35
+ error?: string;
36
+ }
37
+ export declare const RecommendForm: FC<RecommendFormProps>;
38
+ /** The /me section: what is waiting, what is up, and what you wrote. */
39
+ export declare const RecommendationsSection: FC<{
40
+ received: Recommendation[];
41
+ given: Recommendation[];
42
+ error?: string;
43
+ }>;
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
+ import { ago } from "../schema/text.js";
3
+ import { Alert, Badge, Card, Field, MARKDOWN_HINT, Markdown } from "./layout.js";
4
+ function pageOf(party) {
5
+ if (party.slug === null)
6
+ return null;
7
+ return party.kind === 'employer' ? `/employers/${party.slug}` : `/candidates/${party.slug}`;
8
+ }
9
+ const PartyName = ({ party }) => {
10
+ const href = pageOf(party);
11
+ return href === null ? _jsx("span", { children: party.name }) : _jsx("a", { href: href, children: party.name });
12
+ };
13
+ export const RecommendationItem = ({ item, showSubject = false, }) => (_jsxs("div", { class: "recommendation", children: [_jsx(Markdown, { source: item.body, class: "prose-compact recommendation-body" }), _jsxs("p", { class: "small muted recommendation-meta", children: [_jsx("strong", { children: _jsx(PartyName, { party: item.author }) }), showSubject && (_jsxs(_Fragment, { children: [' ', "about ", _jsx(PartyName, { party: item.subject })] })), item.relationship !== null && _jsxs(_Fragment, { children: [" - ", item.relationship] }), ' - ', ago(item.decidedAt ?? item.createdAt)] })] }));
14
+ /** The approved ones, on a candidate's or an employer's page. */
15
+ export const RecommendationList = ({ items, about, }) => items.length === 0 ? (_jsx(_Fragment, {})) : (_jsxs("section", { class: "stack-sm", id: "recommendations", children: [_jsxs("h2", { class: "card-title", children: [items.length, " ", items.length === 1 ? 'recommendation' : 'recommendations'] }), _jsxs("p", { class: "small muted", children: ["Written by people and employers who worked with ", about, ", and shown because ", about, " approved each one."] }), _jsx("ul", { class: "recommendations", children: items.map((item) => (_jsx("li", { children: _jsx(RecommendationItem, { item: item }) }))) })] }));
16
+ export const RecommendForm = ({ action, asOptions, canWriteAsSelf, existing, values = {}, error, }) => (_jsxs("details", { class: "card", id: "recommend", children: [_jsx("summary", { class: "card-title", style: "cursor:pointer", children: existing === null ? 'Write a recommendation' : 'Rewrite your recommendation' }), _jsxs("div", { class: "stack-sm", style: "margin-top:.75rem", children: [error !== undefined && _jsx(Alert, { variant: "error", children: error }), existing !== null && (_jsxs("p", { class: "small muted", children: ["You wrote one ", ago(existing.createdAt), "; it is", ' ', _jsx(Badge, { variant: existing.status === 'approved' ? 'primary' : 'outline', children: existing.status }), ". Writing again replaces it and asks them to read it again."] })), !canWriteAsSelf && asOptions.length === 0 ? (_jsxs("p", { class: "small muted", children: ["A recommendation is signed by a page. ", _jsx("a", { href: "/me/resumes/new", children: "Publish a resume" }), " to write one as yourself, or add the employer you are writing for."] })) : (_jsxs("form", { class: "stack-sm", method: "post", action: action, children: [(asOptions.length > 0 || !canWriteAsSelf) && (_jsx(Field, { label: "From", name: "as", hint: canWriteAsSelf
17
+ ? 'Yourself, or an employer you post for.'
18
+ : 'An employer you post for.', children: _jsxs("select", { class: "select", id: "as", name: "as", children: [canWriteAsSelf && (_jsx("option", { value: "", selected: (values['as'] ?? '') === '', children: "Yourself" })), asOptions.map((option) => (_jsx("option", { value: option.slug, selected: values['as'] === option.slug, children: option.name })))] }) })), _jsx(Field, { label: "How you know them", name: "relationship", hint: '"Hired them for a three-month contract", "Worked together at Acme". Optional.', children: _jsx("input", { class: "input", type: "text", id: "relationship", name: "relationship", maxlength: 120, value: values['relationship'] ?? existing?.relationship ?? '' }) }), _jsx(Field, { label: "What you would say", name: "body", hint: `At least 20 characters. ${MARKDOWN_HINT} It goes on their page with your name on it, once they approve it.`, children: _jsx("textarea", { class: "textarea", id: "body", name: "body", rows: 5, required: true, minlength: 20, maxlength: 2000, children: values['body'] ?? existing?.body ?? '' }) }), _jsx("div", { class: "row", children: _jsx("button", { class: "btn", type: "submit", children: "Send for approval" }) })] }))] })] }));
19
+ const DecisionButtons = ({ item }) => (_jsxs("div", { class: "row", children: [item.status !== 'approved' && (_jsx("form", { method: "post", action: `/me/recommendations/${item.id}/approve`, children: _jsx("button", { class: "btn btn-sm", type: "submit", children: "Approve" }) })), item.status !== 'rejected' && (_jsx("form", { method: "post", action: `/me/recommendations/${item.id}/reject`, children: _jsx("button", { class: "btn btn-secondary btn-sm", type: "submit", children: item.status === 'approved' ? 'Take it down' : 'Reject' }) }))] }));
20
+ /** The /me section: what is waiting, what is up, and what you wrote. */
21
+ export const RecommendationsSection = ({ received, given, error }) => {
22
+ const pending = received.filter((item) => item.status === 'pending');
23
+ const decided = received.filter((item) => item.status !== 'pending');
24
+ return (_jsxs("section", { class: "stack", id: "recommendations", children: [_jsx("h2", { children: "Recommendations" }), error !== undefined && _jsx(Alert, { variant: "error", children: error }), _jsx("p", { class: "small muted", children: "What people and employers who worked with you say about you. Nothing is shown on your page until you approve it, and you can take one down later. There is a form on every candidate and employer page to write one." }), pending.length > 0 && (_jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsxs("h3", { class: "card-title", children: [pending.length, " waiting for you"] }) }), _jsx("ul", { class: "recommendations", children: pending.map((item) => (_jsxs("li", { class: "stack-sm", children: [_jsx(RecommendationItem, { item: item, showSubject: true }), _jsx(DecisionButtons, { item: item })] }))) })] })), decided.length > 0 && (_jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h3", { class: "card-title", children: "About you" }) }), _jsx("ul", { class: "recommendations", children: decided.map((item) => (_jsxs("li", { class: "stack-sm", children: [_jsx(RecommendationItem, { item: item, showSubject: true }), _jsxs("div", { class: "row", style: "align-items:center;gap:.6rem", children: [_jsx(Badge, { variant: item.status === 'approved' ? 'primary' : 'outline', children: item.status === 'approved' ? 'on your page' : 'rejected' }), _jsx(DecisionButtons, { item: item })] })] }))) })] })), given.length > 0 && (_jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h3", { class: "card-title", children: "You wrote" }) }), _jsx("ul", { class: "recommendations", children: given.map((item) => (_jsxs("li", { class: "stack-sm", children: [_jsx(RecommendationItem, { item: item, showSubject: true }), _jsxs("div", { class: "row", style: "align-items:center;gap:.6rem", children: [_jsx(Badge, { variant: item.status === 'approved' ? 'primary' : 'outline', children: item.status }), _jsx("form", { method: "post", action: `/me/recommendations/${item.id}/withdraw`, children: _jsx("button", { class: "btn btn-ghost btn-sm", type: "submit", children: "Withdraw" }) })] })] }))) })] })), received.length === 0 && given.length === 0 && (_jsx("p", { class: "small muted", children: "None yet, in either direction." }))] }));
25
+ };
26
+ //# sourceMappingURL=recommendations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommendations.js","sourceRoot":"","sources":["../../src/views/recommendations.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
- import { Card, Empty, Field } from "./layout.js";
2
+ import { Card, Empty, Field, MARKDOWN_HINT, Markdown } from "./layout.js";
3
3
  import { ago } from "../schema/text.js";
4
4
  import { MessageButton } from "./inbox.js";
5
5
  /** Where an author's own page is, when they have one. */
@@ -22,7 +22,7 @@ export const UpdateItem = ({ update, showAuthor = true, }) => {
22
22
  return (
23
23
  // The id is the feed's anchor: every entry's guid points at this element,
24
24
  // so an item opened from a reader lands on the update it came from.
25
- _jsxs("li", { class: "update", id: update.id, children: [showAuthor && (_jsxs("p", { class: "update-author", children: [href === null ? (_jsx("strong", { children: update.author.name })) : (_jsx("a", { href: href, children: _jsx("strong", { children: update.author.name }) })), ' ', _jsxs("span", { class: "small muted", children: [update.author.kind === 'employer' ? 'employer' : 'candidate', " \u00B7", ' ', ago(update.createdAt)] })] })), _jsx("p", { class: "update-body", children: update.body }), update.link !== null && (_jsx("p", { class: "small", children: _jsx("a", { href: update.link, rel: "nofollow noopener", class: "update-link", children: hostOf(update.link) }) })), !showAuthor && _jsx("p", { class: "small muted", children: ago(update.createdAt) })] }));
25
+ _jsxs("li", { class: "update", id: update.id, children: [showAuthor && (_jsxs("p", { class: "update-author", children: [href === null ? (_jsx("strong", { children: update.author.name })) : (_jsx("a", { href: href, children: _jsx("strong", { children: update.author.name }) })), ' ', _jsxs("span", { class: "small muted", children: [update.author.kind === 'employer' ? 'employer' : 'candidate', " \u00B7", ' ', ago(update.createdAt)] })] })), _jsx(Markdown, { source: update.body, class: "prose-compact update-body" }), update.link !== null && (_jsx("p", { class: "small", children: _jsx("a", { href: update.link, rel: "nofollow noopener", class: "update-link", children: hostOf(update.link) }) })), !showAuthor && _jsx("p", { class: "small muted", children: ago(update.createdAt) })] }));
26
26
  };
27
27
  export const UpdateList = ({ updates, showAuthor = true, }) => (_jsx("ul", { class: "update-list", children: updates.map((update) => (_jsx(UpdateItem, { update: update, showAuthor: showAuthor }))) }));
28
28
  /**
@@ -32,7 +32,7 @@ export const UpdateList = ({ updates, showAuthor = true, }) => (_jsx("ul", { cla
32
32
  * candidate's own dashboard without either growing a hidden "who am I" field
33
33
  * that a caller could change.
34
34
  */
35
- export const UpdateComposer = ({ action, as, max, error, value }) => (_jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Post an update" }), _jsxs("p", { class: "card-description", children: ["As ", _jsx("strong", { children: as }), ". What changed: a role filled, something shipped, when you are free next. Five a day, ", max, " characters, one link."] })] }), _jsxs("form", { method: "post", action: action, class: "stack-sm", children: [_jsx(Field, { label: "Update", name: "body", error: error, children: _jsx("textarea", { id: "body", name: "body", rows: 3, maxlength: max, required: true, placeholder: "We just closed the backend role. Two more open next month.", children: value ?? '' }) }), _jsx(Field, { label: "Link", name: "link", hint: "Optional. One public URL.", children: _jsx("input", { id: "link", name: "link", type: "url", placeholder: "https://" }) }), _jsx("div", { class: "row", children: _jsx("button", { class: "btn", type: "submit", children: "Post" }) })] })] }));
35
+ export const UpdateComposer = ({ action, as, max, error, value }) => (_jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Post an update" }), _jsxs("p", { class: "card-description", children: ["As ", _jsx("strong", { children: as }), ". What changed: a role filled, something shipped, when you are free next. Five a day, ", max, " characters, one link."] })] }), _jsxs("form", { method: "post", action: action, class: "stack-sm", children: [_jsx(Field, { label: "Update", name: "body", hint: MARKDOWN_HINT, error: error, children: _jsx("textarea", { id: "body", name: "body", rows: 3, maxlength: max, required: true, placeholder: "We just closed the backend role. Two more open next month.", children: value ?? '' }) }), _jsx(Field, { label: "Link", name: "link", hint: "Optional. One public URL.", children: _jsx("input", { id: "link", name: "link", type: "url", placeholder: "https://" }) }), _jsx("div", { class: "row", children: _jsx("button", { class: "btn", type: "submit", children: "Post" }) })] })] }));
36
36
  /**
37
37
  * Follow, as a form rather than a link.
38
38
  *
@@ -40,11 +40,11 @@ export const UpdateComposer = ({ action, as, max, error, value }) => (_jsxs(Card
40
40
  * scanner or crawler can make on the reader's behalf.
41
41
  */
42
42
  export const FollowButton = ({ action, following, followers, signedIn, next }) => (_jsxs("div", { class: "row", style: "align-items:center;gap:.6rem;flex-wrap:wrap", children: [signedIn ? (_jsxs("form", { method: "post", action: action, children: [_jsx("input", { type: "hidden", name: "following", value: following ? 'yes' : 'no' }), _jsx("button", { class: following ? 'btn btn-secondary btn-sm' : 'btn btn-sm', type: "submit", children: following ? 'Following' : 'Follow' })] })) : (_jsx("a", { class: "btn btn-sm", href: `/login?next=${encodeURIComponent(next)}`, children: "Follow" })), _jsxs("span", { class: "small muted", children: [followers, " ", followers === 1 ? 'follower' : 'followers'] })] }));
43
- export const AuthorSocial = ({ as, updates, follow, composer, message, error }) => (_jsxs("div", { class: "stack", children: [_jsxs("div", { class: "row", style: "align-items:center;gap:.6rem;flex-wrap:wrap", children: [_jsx(FollowButton, { ...follow }), message !== undefined && _jsx(MessageButton, { ...message })] }), composer !== null && (_jsx(UpdateComposer, { action: composer.action, as: as, max: composer.max, error: error })), updates.length > 0 && (_jsxs("div", { class: "stack-sm", children: [_jsx("h2", { class: "card-title", children: "Updates" }), _jsx(UpdateList, { updates: updates, showAuthor: false })] }))] }));
43
+ export const AuthorSocial = ({ as, updates, follow, composer, message, error, }) => (_jsxs("div", { class: "stack", children: [_jsxs("div", { class: "row", style: "align-items:center;gap:.6rem;flex-wrap:wrap", children: [_jsx(FollowButton, { ...follow }), message !== undefined && _jsx(MessageButton, { ...message })] }), composer !== null && (_jsx(UpdateComposer, { action: composer.action, as: as, max: composer.max, error: error })), updates.length > 0 && (_jsxs("div", { class: "stack-sm", children: [_jsx("h2", { class: "card-title", children: "Updates" }), _jsx(UpdateList, { updates: updates, showAuthor: false })] }))] }));
44
44
  /** The board's news page: everything anybody posted. */
45
45
  export const UpdatesPage = ({ updates, boardName, followed, following }) => (_jsxs("div", { class: "stack", children: [_jsxs("div", { class: "stack-sm", children: [_jsx("h1", { children: "Updates" }), _jsxs("p", { class: "lede", children: ["Short posts from the employers and candidates on ", boardName, ". Everyone here is a real employer or a person with a resume, and nobody can post more than five a day."] })] }), followed !== null && (_jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsxs("h2", { class: "card-title", children: ["From the ", following.length, " you follow"] }) }), followed.length === 0 ? (_jsx("p", { class: "small muted", children: following.length === 0
46
46
  ? 'You do not follow anybody yet. There is a Follow button on every employer and candidate page.'
47
47
  : 'Nothing yet from anybody you follow.' })) : (_jsx(UpdateList, { updates: followed })), following.length > 0 && (_jsxs("p", { class: "small muted", style: "margin-top:.6rem", children: ["Following:", ' ', following.map((entry, index) => (_jsxs(_Fragment, { children: [index > 0 && ', ', entry.slug === null ? (entry.name) : (_jsx("a", { href: entry.kind === 'employer'
48
48
  ? `/employers/${entry.slug}`
49
- : `/candidates/${entry.slug}`, children: entry.name }))] })))] }))] })), _jsx("h2", { class: "card-title", children: "Everyone" }), updates.length === 0 ? (_jsxs(Empty, { children: [_jsx("h2", { children: "Nothing posted yet" }), _jsx("p", { children: "An employer or a candidate posts here from their own page. It is the space between \"posted a job\" and silence." })] })) : (_jsx(UpdateList, { updates: updates })), _jsxs("p", { class: "small muted", children: ["This page is a feed: ", _jsx("a", { href: "/updates/feed", children: "/updates/feed" }), ", as Markdown at", ' ', _jsx("a", { href: "/updates.md", children: "/updates.md" }), ", as JSON at ", _jsx("a", { href: "/api/v1/updates", children: "/api/v1/updates" }), ". One author at a time with ", _jsx("code", { children: "?org=slug" }), " or ", _jsx("code", { children: "?candidate=slug" }), "."] })] }));
49
+ : `/candidates/${entry.slug}`, children: entry.name }))] })))] }))] })), _jsx("h2", { class: "card-title", children: "Everyone" }), updates.length === 0 ? (_jsxs(Empty, { children: [_jsx("h2", { children: "Nothing posted yet" }), _jsx("p", { children: "An employer or a candidate posts here from their own page. It is the space between \"posted a job\" and silence." })] })) : (_jsx(UpdateList, { updates: updates })), _jsxs("p", { class: "small muted", children: ["This page is a feed: ", _jsx("a", { href: "/updates/feed", children: "/updates/feed" }), ", as Markdown at", ' ', _jsx("a", { href: "/updates.md", children: "/updates.md" }), ", as JSON at", ' ', _jsx("a", { href: "/api/v1/updates", children: "/api/v1/updates" }), ". One author at a time with", ' ', _jsx("code", { children: "?org=slug" }), " or ", _jsx("code", { children: "?candidate=slug" }), "."] })] }));
50
50
  //# sourceMappingURL=updates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/views/updates.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/views/updates.tsx"],"names":[],"mappings":"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"}
package/docs/openjob.md CHANGED
@@ -35,6 +35,14 @@ serves at `GET /api/v1/jobs/{slug}`.
35
35
  "seniority": "staff",
36
36
  "location": "European timezones",
37
37
  "remoteRegions": ["DE", "NL", "PT"],
38
+ "pay": {
39
+ "lines": [
40
+ { "type": "yearly", "min": 180000, "max": 230000, "currency": "USD", "unit": null }
41
+ ],
42
+ "method": "payroll",
43
+ "equity": "0.1% - 0.4%",
44
+ "unpaid": false
45
+ },
38
46
  "salary": {
39
47
  "min": 180000,
40
48
  "max": 230000,
@@ -57,6 +65,60 @@ serves at `GET /api/v1/jobs/{slug}`.
57
65
 
58
66
  `description` is Markdown. Not HTML, and not plain text with the formatting removed.
59
67
 
68
+ ## pay
69
+
70
+ What it pays, in full, and **required before a listing can be published**. A listing
71
+ that says nothing about pay gets fewer and worse applications, and an agent reading it
72
+ cannot tell whether to bother; on this board "not stated" is not a listing anybody can
73
+ act on. "Unpaid" counts, because it is an answer.
74
+
75
+ `pay.lines` is a list because one price is not enough for the work this board is for.
76
+ A listing that pays per task, per pull request and per social post has three lines,
77
+ and a reader deciding whether to apply needs all of them:
78
+
79
+ ```json
80
+ "pay": {
81
+ "lines": [
82
+ { "type": "per_task", "min": 0.25, "max": 0.25, "currency": "USD", "unit": "task" },
83
+ { "type": "per_unit", "min": 0.25, "max": 0.25, "currency": "USD", "unit": "PR that fixes a bug you find" },
84
+ { "type": "per_unit", "min": 0.25, "max": 0.25, "currency": "USD", "unit": "social post linking to your page" }
85
+ ],
86
+ "method": "SOL",
87
+ "equity": null,
88
+ "unpaid": false
89
+ }
90
+ ```
91
+
92
+ `type` is one of `hourly`, `daily`, `weekly`, `monthly`, `yearly`, `fixed`, `per_task`,
93
+ `per_unit`, `revenue_share`, `bounty`: the same list [ugig.net](https://ugig.net) carries
94
+ as a gig's `budget_type`, in the same spelling, so a gig there and a job here describe
95
+ pay the same way. `currency` is what the figure is written in, an ISO code or a ticker
96
+ such as `SOL`; `%` for a revenue share. `method` is separate from the price on purpose:
97
+ "$100 an hour paid in USDC" is one rate with a settlement preference, not two rates,
98
+ and the number does not change because the rail did. It is a coin (`SOL`, `USDC`, `ETH`,
99
+ `USDT`, `POL`) or a rail (`bank transfer`, `PayPal`, `payroll`).
100
+
101
+ **Writing it.** Nobody has to build that JSON. Every writer on this board, the web form,
102
+ the API, the CLI, the job file and the MCP tool, takes each line as the sentence a person
103
+ would say, and the reference implementation parses it:
104
+
105
+ ```
106
+ $120k - $150k a year $100 an hour $800 a day
107
+ $5000 fixed $250 bounty 10% revenue share
108
+ $0.25 per task $0.25 per PR that fixes a bug you find
109
+ 0.01 SOL per task $0.25 per social post, settled in SOL
110
+ ```
111
+
112
+ A rail on the end of a line ("settled in SOL", "via bank transfer") becomes `method`.
113
+ A line that says how much but not what for (`$60k`) is refused with the fix. In a job
114
+ file the lines are a `pay:` list in the front matter and `pay_method:` beside it; over
115
+ the API, `pay` is an array of those strings or of line objects.
116
+
117
+ `salary` is the first time-based line flattened to `min`, `max`, `currency`, `period`,
118
+ kept for readers written against earlier versions and for the salary filter and sort,
119
+ which compare on an annual basis. A listing that pays per task has a null range there,
120
+ and its pay in `pay`.
121
+
60
122
  ## agentPolicy
61
123
 
62
124
  The field this format exists for. Required on every listing, with exactly three
@@ -168,6 +230,7 @@ both - the JSON-LD for search engines, the OpenJob document for everything else.
168
230
  | `workplace: "remote"` | `jobLocationType: "TELECOMMUTE"` |
169
231
  | `remoteRegions` | `applicantLocationRequirements` |
170
232
  | `location` | `jobLocation` |
233
+ | `pay` | nothing whole; the first time-based line travels as `salary`, below |
171
234
  | `salary` | `baseSalary`, plus an annualised `estimatedSalary` |
172
235
  | `salary.unpaid` | nothing; schema.org has no vocabulary for it, so `baseSalary` is simply absent |
173
236
  | `expiresAt` | `validThrough` |
@@ -0,0 +1,38 @@
1
+ -- What a listing pays, in full.
2
+ --
3
+ -- A salary range per year was the whole vocabulary, and it described one
4
+ -- kind of work. The listings this board exists for pay per task, per pull
5
+ -- request, per social post, a flat fee for a project, a share of revenue or
6
+ -- a bounty, in dollars or in a coin, settled over whatever rail the two sides
7
+ -- agree on. This is the same model ugig.net carries as budget_type,
8
+ -- budget_unit and payment_coin, so a gig there and a job here describe pay
9
+ -- the same way.
10
+ --
11
+ -- The lines are JSON rather than a child table because they are read and
12
+ -- written as one value with the listing, never queried on their own: the
13
+ -- salary_* columns stay as the flattened first time-based line, which is
14
+ -- what the salary filter, the salary sort and the JobPosting structured
15
+ -- data compare on. A price per task has no annual figure and does not belong
16
+ -- in any of those.
17
+ alter table jobs add column if not exists pay_lines jsonb not null default '[]'::jsonb;
18
+ -- How it is settled: a coin such as SOL, or a rail such as "bank transfer".
19
+ alter table jobs add column if not exists pay_method text;
20
+
21
+ -- Every listing that already stated a range becomes one line, so the page
22
+ -- and the API say the same thing before and after this migration.
23
+ update jobs
24
+ set pay_lines = jsonb_build_array(jsonb_build_object(
25
+ 'type', case salary_period
26
+ when 'hour' then 'hourly'
27
+ when 'day' then 'daily'
28
+ when 'week' then 'weekly'
29
+ when 'month' then 'monthly'
30
+ else 'yearly'
31
+ end,
32
+ 'min', salary_min,
33
+ 'max', salary_max,
34
+ 'currency', upper(coalesce(salary_currency, 'USD')),
35
+ 'unit', null))
36
+ where pay_lines = '[]'::jsonb
37
+ and salary_unpaid = false
38
+ and (salary_min is not null or salary_max is not null);
@@ -0,0 +1,65 @@
1
+ -- Recommendations: what somebody who worked with you says about you, shown
2
+ -- on your page once you have agreed to it.
3
+ --
4
+ -- Not a rating. A star out of five from a stranger who paid you once is a
5
+ -- number that says nothing and cannot be answered; it is the thing that
6
+ -- makes a marketplace profile a scoreboard. A recommendation is a paragraph
7
+ -- with a name on it, from an employer who hired you or a person you hired,
8
+ -- and it goes on your page only when you approve it. You can reject one,
9
+ -- and nothing is shown. That is LinkedIn's model, and it is the right one
10
+ -- for a board where every profile is a person's own document.
11
+ --
12
+ -- Both directions, because the board is symmetric: an employer recommends a
13
+ -- candidate, and a candidate recommends an employer. Each side is a person
14
+ -- or an employer, the same way a message is.
15
+ create table if not exists recommendations (
16
+ id uuid primary key default gen_random_uuid(),
17
+ -- Who is saying it: a person as themselves, or an employer through a
18
+ -- member. Exactly one.
19
+ author_user_id uuid references users (id) on delete cascade,
20
+ author_org_id uuid references organisations (id) on delete cascade,
21
+ -- The person who typed it, kept even for an employer's, so "who wrote
22
+ -- this" has an answer after they leave the company.
23
+ written_by uuid not null references users (id) on delete cascade,
24
+ -- Who it is about. Exactly one.
25
+ user_id uuid references users (id) on delete cascade,
26
+ org_id uuid references organisations (id) on delete cascade,
27
+ -- The words. Text, rendered as text.
28
+ body text not null check (length(body) between 20 and 2000),
29
+ -- "Hired them for a three-month contract", "Worked with them at Acme".
30
+ relationship text,
31
+ -- pending until the subject approves; approved is public; rejected is
32
+ -- kept so the author can see it was, and so it cannot be re-sent daily.
33
+ status text not null default 'pending'
34
+ check (status in ('pending', 'approved', 'rejected')),
35
+ created_at timestamptz not null default now(),
36
+ updated_at timestamptz not null default now(),
37
+ decided_at timestamptz,
38
+ constraint recommendations_one_author check (
39
+ (author_user_id is null) <> (author_org_id is null)
40
+ ),
41
+ constraint recommendations_one_subject check ((user_id is null) <> (org_id is null)),
42
+ -- Nobody recommends themselves, and an employer does not recommend itself.
43
+ constraint recommendations_not_self check (
44
+ (author_user_id is null or user_id is null or author_user_id <> user_id)
45
+ and (author_org_id is null or org_id is null or author_org_id <> org_id)
46
+ )
47
+ );
48
+
49
+ -- One per author per subject. Writing it again replaces the words and goes
50
+ -- back to pending for the subject to read again.
51
+ create unique index if not exists recommendations_user_user_key
52
+ on recommendations (author_user_id, user_id) where author_user_id is not null and user_id is not null;
53
+ create unique index if not exists recommendations_user_org_key
54
+ on recommendations (author_user_id, org_id) where author_user_id is not null and org_id is not null;
55
+ create unique index if not exists recommendations_org_user_key
56
+ on recommendations (author_org_id, user_id) where author_org_id is not null and user_id is not null;
57
+ create unique index if not exists recommendations_org_org_key
58
+ on recommendations (author_org_id, org_id) where author_org_id is not null and org_id is not null;
59
+
60
+ -- A page reads "approved, newest first" for one subject.
61
+ create index if not exists recommendations_user_idx on recommendations (user_id, status, decided_at desc)
62
+ where user_id is not null;
63
+ create index if not exists recommendations_org_idx on recommendations (org_id, status, decided_at desc)
64
+ where org_id is not null;
65
+ create index if not exists recommendations_written_idx on recommendations (written_by, created_at desc);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@profullstack/agenticjobs",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "An agent-friendly job board you self-host. It posts its own jobs, never scrapes anyone else's, and answers on every surface: web, API, MCP, CLI, TUI, desktop and PWA. Instances find each other through an open directory.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -750,6 +750,41 @@ a.badge-plain:hover .badge {
750
750
  font-weight: 600;
751
751
  }
752
752
 
753
+ /* A body inside a card: a message, an update, a recommendation, an answer.
754
+ Same grammar as a listing, tighter spacing, and no heading taller than the
755
+ card's own title. The last block loses its bottom margin so the meta line
756
+ underneath sits where it did when the body was one paragraph. */
757
+ .prose-compact {
758
+ max-width: none;
759
+ }
760
+
761
+ .prose-compact p,
762
+ .prose-compact ul,
763
+ .prose-compact ol,
764
+ .prose-compact blockquote,
765
+ .prose-compact pre,
766
+ .prose-compact .table-wrap {
767
+ margin: 0 0 0.6rem;
768
+ }
769
+
770
+ .prose-compact > :last-child {
771
+ margin-bottom: 0;
772
+ }
773
+
774
+ .prose-compact h1,
775
+ .prose-compact h2,
776
+ .prose-compact h3,
777
+ .prose-compact h4,
778
+ .prose-compact h5,
779
+ .prose-compact h6 {
780
+ font-size: 1.05em;
781
+ margin: 0.9rem 0 0.3rem;
782
+ }
783
+
784
+ .prose-compact hr {
785
+ margin: 0.9rem 0;
786
+ }
787
+
753
788
  /* --- misc -------------------------------------------------------------- */
754
789
 
755
790
  .code-block {
@@ -884,8 +919,6 @@ a.badge-plain:hover .badge {
884
919
 
885
920
  .update-body {
886
921
  margin: 0;
887
- /* Written in a textarea, so its line breaks are the ones the author made. */
888
- white-space: pre-wrap;
889
922
  /* A pasted URL is one unbreakable word and would otherwise push the card
890
923
  wider than the viewport on a phone. */
891
924
  overflow-wrap: anywhere;
@@ -950,8 +983,6 @@ a.badge-plain:hover .badge {
950
983
 
951
984
  .message-body {
952
985
  margin: 0;
953
- /* Typed in a textarea, so the line breaks are the author's. */
954
- white-space: pre-wrap;
955
986
  overflow-wrap: anywhere;
956
987
  }
957
988
 
@@ -973,7 +1004,7 @@ a.badge-plain:hover .badge {
973
1004
 
974
1005
  .invoice-description {
975
1006
  margin: 0;
976
- white-space: pre-wrap;
1007
+ overflow-wrap: anywhere;
977
1008
  }
978
1009
 
979
1010
  .invoice-form > summary {
@@ -1002,3 +1033,27 @@ a.badge-plain:hover .badge {
1002
1033
  color: var(--muted-foreground);
1003
1034
  font-weight: 500;
1004
1035
  }
1036
+
1037
+ /* --- recommendations --------------------------------------------------- */
1038
+
1039
+ .recommendations {
1040
+ list-style: none;
1041
+ margin: 0;
1042
+ padding: 0;
1043
+ display: flex;
1044
+ flex-direction: column;
1045
+ gap: 0.9rem;
1046
+ }
1047
+
1048
+ .recommendation {
1049
+ padding-left: 0.9rem;
1050
+ border-left: 3px solid color-mix(in oklab, var(--primary) 45%, var(--border));
1051
+ }
1052
+
1053
+ .recommendation-body {
1054
+ overflow-wrap: anywhere;
1055
+ }
1056
+
1057
+ .recommendation-meta {
1058
+ margin: 0.35rem 0 0;
1059
+ }
package/web/public/sw.js CHANGED
@@ -13,7 +13,7 @@
13
13
  * drifted, which is the only version of this rule that survives contact.
14
14
  */
15
15
 
16
- const VERSION = 'f53a4407';
16
+ const VERSION = 'bb197f9b';
17
17
  const SHELL = `shell-${VERSION}`;
18
18
  const ASSETS = ['/assets/app.css', '/assets/tokens.css', '/assets/icon.svg'];
19
19