@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":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The TUI's state, and the pure functions over it.
3
+ *
4
+ * Every view is a function of one of these objects and nothing else, which is
5
+ * what lets hqtui's renderToText exercise the real layout in a test instead of
6
+ * a reimplementation of it. Nothing here touches the network or the terminal.
7
+ */
8
+ import type { Job } from '../schema/index.ts';
9
+ export declare const TABS: readonly ["find", "drafts", "listings", "boards"];
10
+ export type Tab = (typeof TABS)[number];
11
+ export interface DraftRow {
12
+ id: string;
13
+ jobTitle: string;
14
+ jobSlug: string;
15
+ createdAt: string;
16
+ }
17
+ export interface BoardRow {
18
+ server: string;
19
+ name: string;
20
+ email: string | null;
21
+ current: boolean;
22
+ }
23
+ export interface TuiState {
24
+ tab: Tab;
25
+ server: string;
26
+ /** Set while a request is in flight, so the frame can say so. */
27
+ busy: string | null;
28
+ /** Shown in the status bar until the next action replaces it. */
29
+ message: string | null;
30
+ error: string | null;
31
+ query: string;
32
+ /** True while the search box has the keyboard. */
33
+ editing: boolean;
34
+ jobs: Job[];
35
+ jobsTotal: number;
36
+ jobIndex: number;
37
+ /** Set when a listing is open over the list. */
38
+ detail: Job | null;
39
+ drafts: DraftRow[];
40
+ draftIndex: number;
41
+ listings: Job[];
42
+ listingIndex: number;
43
+ boards: BoardRow[];
44
+ boardIndex: number;
45
+ /** True when the account can post, which changes what the help bar says. */
46
+ canPost: boolean;
47
+ signedIn: boolean;
48
+ }
49
+ export declare function initialState(server: string): TuiState;
50
+ /** How many rows the active tab has, so movement can be written once. */
51
+ export declare function rowCount(state: TuiState): number;
52
+ export declare function selectedIndex(state: TuiState): number;
53
+ export declare function withSelection(state: TuiState, index: number): TuiState;
54
+ export declare function move(state: TuiState, delta: number): TuiState;
55
+ export declare function nextTab(state: TuiState, delta: number): TuiState;
56
+ export declare function selectedJob(state: TuiState): Job | null;
57
+ export declare function selectedDraft(state: TuiState): DraftRow | null;
58
+ export declare function selectedBoard(state: TuiState): BoardRow | null;
59
+ /** What the bottom bar offers, which differs per tab and per role. */
60
+ export declare function keyHints(state: TuiState): {
61
+ key: string;
62
+ label: string;
63
+ }[];
@@ -0,0 +1,136 @@
1
+ /**
2
+ * The TUI's state, and the pure functions over it.
3
+ *
4
+ * Every view is a function of one of these objects and nothing else, which is
5
+ * what lets hqtui's renderToText exercise the real layout in a test instead of
6
+ * a reimplementation of it. Nothing here touches the network or the terminal.
7
+ */
8
+ export const TABS = ['find', 'drafts', 'listings', 'boards'];
9
+ export function initialState(server) {
10
+ return {
11
+ tab: 'find',
12
+ server,
13
+ busy: null,
14
+ message: null,
15
+ error: null,
16
+ query: '',
17
+ editing: false,
18
+ jobs: [],
19
+ jobsTotal: 0,
20
+ jobIndex: 0,
21
+ detail: null,
22
+ drafts: [],
23
+ draftIndex: 0,
24
+ listings: [],
25
+ listingIndex: 0,
26
+ boards: [],
27
+ boardIndex: 0,
28
+ canPost: false,
29
+ signedIn: false,
30
+ };
31
+ }
32
+ /** How many rows the active tab has, so movement can be written once. */
33
+ export function rowCount(state) {
34
+ switch (state.tab) {
35
+ case 'find':
36
+ return state.jobs.length;
37
+ case 'drafts':
38
+ return state.drafts.length;
39
+ case 'listings':
40
+ return state.listings.length;
41
+ case 'boards':
42
+ return state.boards.length;
43
+ }
44
+ }
45
+ export function selectedIndex(state) {
46
+ switch (state.tab) {
47
+ case 'find':
48
+ return state.jobIndex;
49
+ case 'drafts':
50
+ return state.draftIndex;
51
+ case 'listings':
52
+ return state.listingIndex;
53
+ case 'boards':
54
+ return state.boardIndex;
55
+ }
56
+ }
57
+ export function withSelection(state, index) {
58
+ // Clamped rather than wrapped: holding a cursor key past the end and
59
+ // reappearing at the top is disorienting in a list you are reading.
60
+ const count = rowCount(state);
61
+ const next = count === 0 ? 0 : Math.min(count - 1, Math.max(0, index));
62
+ switch (state.tab) {
63
+ case 'find':
64
+ return { ...state, jobIndex: next };
65
+ case 'drafts':
66
+ return { ...state, draftIndex: next };
67
+ case 'listings':
68
+ return { ...state, listingIndex: next };
69
+ case 'boards':
70
+ return { ...state, boardIndex: next };
71
+ }
72
+ }
73
+ export function move(state, delta) {
74
+ return withSelection(state, selectedIndex(state) + delta);
75
+ }
76
+ export function nextTab(state, delta) {
77
+ const index = TABS.indexOf(state.tab);
78
+ const next = TABS[(index + delta + TABS.length) % TABS.length] ?? 'find';
79
+ return { ...state, tab: next, detail: null };
80
+ }
81
+ export function selectedJob(state) {
82
+ if (state.tab === 'find')
83
+ return state.jobs[state.jobIndex] ?? null;
84
+ if (state.tab === 'listings')
85
+ return state.listings[state.listingIndex] ?? null;
86
+ return null;
87
+ }
88
+ export function selectedDraft(state) {
89
+ return state.drafts[state.draftIndex] ?? null;
90
+ }
91
+ export function selectedBoard(state) {
92
+ return state.boards[state.boardIndex] ?? null;
93
+ }
94
+ /** What the bottom bar offers, which differs per tab and per role. */
95
+ export function keyHints(state) {
96
+ if (state.editing) {
97
+ return [
98
+ { key: 'enter', label: 'search' },
99
+ { key: 'esc', label: 'cancel' },
100
+ ];
101
+ }
102
+ const common = [
103
+ { key: 'tab', label: 'switch' },
104
+ { key: '/', label: 'search' },
105
+ { key: 'r', label: 'reload' },
106
+ { key: 'q', label: 'quit' },
107
+ ];
108
+ if (state.detail !== null) {
109
+ return [
110
+ { key: 'a', label: 'apply' },
111
+ { key: 'd', label: 'prepare draft' },
112
+ { key: 'esc', label: 'back' },
113
+ ...common,
114
+ ];
115
+ }
116
+ switch (state.tab) {
117
+ case 'find':
118
+ return [{ key: 'enter', label: 'open' }, ...common];
119
+ case 'drafts':
120
+ return [
121
+ { key: 'enter', label: 'send' },
122
+ { key: 'x', label: 'discard' },
123
+ ...common,
124
+ ];
125
+ case 'listings':
126
+ return [
127
+ { key: 'p', label: 'publish' },
128
+ { key: 'c', label: 'close' },
129
+ { key: 'enter', label: 'applications' },
130
+ ...common,
131
+ ];
132
+ case 'boards':
133
+ return [{ key: 'enter', label: 'use' }, ...common];
134
+ }
135
+ }
136
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { Job } from '../schema/index.ts';
2
+ export * from './state.ts';
@@ -0,0 +1,2 @@
1
+ export * from "./state.js";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tui/types.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The screens, as pure functions.
3
+ *
4
+ * Each takes the hqtui container and one state object and draws. No network,
5
+ * no timers, no reading the clock beyond what the state carries - which is
6
+ * what lets a test render the real layout to text and assert on it.
7
+ */
8
+ import { type Container, type Theme } from '@profullstack/hqtui';
9
+ import { selectedIndex, type TuiState } from './types.ts';
10
+ export declare function render(ui: Container, theme: Theme, state: TuiState): void;
11
+ export { selectedIndex };
@@ -0,0 +1,197 @@
1
+ /**
2
+ * The screens, as pure functions.
3
+ *
4
+ * Each takes the hqtui container and one state object and draws. No network,
5
+ * no timers, no reading the clock beyond what the state carries - which is
6
+ * what lets a test render the real layout to text and assert on it.
7
+ */
8
+ import { fill } from '@profullstack/hqtui';
9
+ import { ago, formatSalary } from "../schema/text.js";
10
+ import { toPlainText } from "../markup/markdown.js";
11
+ import { keyHints, selectedIndex, } from "./types.js";
12
+ export function render(ui, theme, state) {
13
+ ui.statusBar({
14
+ items: [
15
+ { label: 'agenticjobs', active: true },
16
+ { label: state.server.replace(/^https?:\/\//, '') },
17
+ ...(state.signedIn ? [] : [{ label: 'not signed in', color: theme.warning }]),
18
+ ],
19
+ right: [
20
+ { label: state.tab },
21
+ ...(state.busy === null ? [] : [{ label: state.busy, color: theme.accent }]),
22
+ ],
23
+ });
24
+ ui.tabs({
25
+ tabs: [
26
+ 'Find work',
27
+ `Drafts${state.drafts.length === 0 ? '' : ` (${state.drafts.length})`}`,
28
+ 'Your listings',
29
+ 'Boards',
30
+ ],
31
+ active: ['find', 'drafts', 'listings', 'boards'].indexOf(state.tab),
32
+ variant: 'underline',
33
+ });
34
+ if (state.error !== null) {
35
+ ui.text([{ text: ' ! ', bg: theme.danger }, { text: ` ${state.error}` }]);
36
+ }
37
+ else if (state.message !== null) {
38
+ ui.label(` ${state.message}`);
39
+ }
40
+ if (state.detail !== null) {
41
+ jobDetail(ui, theme, state.detail);
42
+ }
43
+ else {
44
+ switch (state.tab) {
45
+ case 'find':
46
+ findTab(ui, theme, state);
47
+ break;
48
+ case 'drafts':
49
+ draftsTab(ui, theme, state);
50
+ break;
51
+ case 'listings':
52
+ listingsTab(ui, theme, state);
53
+ break;
54
+ case 'boards':
55
+ boardsTab(ui, theme, state);
56
+ break;
57
+ }
58
+ }
59
+ ui.statusBar({ items: keyHints(state).map((hint) => ({ key: hint.key, label: hint.label })) });
60
+ }
61
+ function findTab(ui, theme, state) {
62
+ ui.panel({ title: state.editing ? 'Search (enter to run)' : 'Search' }, (panel) => {
63
+ panel.text(state.query === '' ? (state.editing ? '_' : 'press / to search') : state.query);
64
+ });
65
+ if (state.jobs.length === 0) {
66
+ ui.panel({ title: 'Jobs' }, (panel) => {
67
+ panel.label('Nothing here.');
68
+ panel.label('This board only holds listings posted to it, so that means');
69
+ panel.label('nobody posted one, not that a crawler missed it.');
70
+ });
71
+ return;
72
+ }
73
+ ui.panel({ title: `Jobs (${state.jobs.length} of ${state.jobsTotal})`, size: fill }, (panel) => {
74
+ panel.list({
75
+ items: state.jobs.map((job) => ({
76
+ label: jobRow(job),
77
+ badge: job.agentPolicy === 'welcome' ? 'agents' : undefined,
78
+ color: job.agentPolicy === 'human-only' ? theme.muted : undefined,
79
+ })),
80
+ selected: state.jobIndex,
81
+ followSelection: true,
82
+ scrollbar: true,
83
+ });
84
+ });
85
+ }
86
+ function jobRow(job) {
87
+ const salary = formatSalary(job.salary);
88
+ const bits = [job.org.name, job.workplace, salary ?? '', ago(job.publishedAt)].filter((bit) => bit !== '');
89
+ return `${job.title} - ${bits.join(' | ')}`;
90
+ }
91
+ function jobDetail(ui, theme, job) {
92
+ ui.heading(job.title);
93
+ ui.label(`${job.org.name}${job.location === null ? '' : ` - ${job.location}`}`);
94
+ ui.keyValues([
95
+ { label: 'Where', value: `${job.workplace}${job.location === null ? '' : `, ${job.location}`}` },
96
+ { label: 'Type', value: job.employmentType },
97
+ { label: 'Level', value: job.seniority ?? 'unspecified' },
98
+ { label: 'Pay', value: formatSalary(job.salary) ?? 'not stated' },
99
+ {
100
+ label: 'Agents',
101
+ value: agentPolicyText(job.agentPolicy),
102
+ color: job.agentPolicy === 'welcome'
103
+ ? theme.success
104
+ : job.agentPolicy === 'human-only'
105
+ ? theme.muted
106
+ : theme.warning,
107
+ },
108
+ { label: 'Stack', value: job.stack.join(', ') || '-' },
109
+ { label: 'Apply', value: job.apply.via },
110
+ ]);
111
+ ui.panel({ title: 'The listing', size: fill }, (panel) => {
112
+ // The description is Markdown; the terminal gets it flattened rather than
113
+ // half-rendered, because a half-rendered heading reads worse than none.
114
+ panel.text(toPlainText(job.description, 4000), { wrap: true });
115
+ });
116
+ }
117
+ function agentPolicyText(policy) {
118
+ if (policy === 'welcome')
119
+ return 'welcome, no disclosure asked';
120
+ if (policy === 'human-only')
121
+ return 'asks for a human-written application';
122
+ return 'welcome if disclosed';
123
+ }
124
+ function draftsTab(ui, theme, state) {
125
+ ui.panel({ title: 'Prepared, not sent' }, (panel) => {
126
+ panel.label('An agent can write these. You decide which ones go out.');
127
+ });
128
+ if (state.drafts.length === 0) {
129
+ ui.panel({ title: 'Drafts' }, (panel) => {
130
+ panel.label('Nothing waiting.');
131
+ panel.label('Open a job and press d to prepare one.');
132
+ });
133
+ return;
134
+ }
135
+ ui.panel({ title: `Drafts (${state.drafts.length})`, size: fill }, (panel) => {
136
+ panel.list({
137
+ items: state.drafts.map((draft) => ({
138
+ label: `${draft.jobTitle} ${ago(draft.createdAt)}`,
139
+ color: theme.accent,
140
+ })),
141
+ selected: state.draftIndex,
142
+ followSelection: true,
143
+ scrollbar: true,
144
+ });
145
+ });
146
+ }
147
+ function listingsTab(ui, theme, state) {
148
+ if (!state.canPost) {
149
+ ui.panel({ title: 'Your listings' }, (panel) => {
150
+ panel.label('No employer on this account yet, so there is nothing to post under.');
151
+ panel.label('Add one in a browser, or with the API, then come back.');
152
+ });
153
+ return;
154
+ }
155
+ if (state.listings.length === 0) {
156
+ ui.panel({ title: 'Your listings' }, (panel) => {
157
+ panel.label('Nothing posted yet.');
158
+ panel.label('agenticjobs post job.md');
159
+ });
160
+ return;
161
+ }
162
+ ui.panel({ title: `Your listings (${state.listings.length})`, size: fill }, (panel) => {
163
+ panel.list({
164
+ items: state.listings.map((job) => ({
165
+ label: `${job.title} ${job.org.name}`,
166
+ badge: job.status,
167
+ color: job.status === 'published' ? theme.success : theme.muted,
168
+ })),
169
+ selected: state.listingIndex,
170
+ followSelection: true,
171
+ scrollbar: true,
172
+ });
173
+ });
174
+ }
175
+ function boardsTab(ui, theme, state) {
176
+ ui.panel({ title: 'Boards you are signed in to' }, (panel) => {
177
+ panel.label('One account per board. Search across all of them with: agenticjobs search --all');
178
+ });
179
+ if (state.boards.length === 0) {
180
+ ui.panel({ title: 'Boards' }, (panel) => {
181
+ panel.label('None yet. Run: agenticjobs login <url>');
182
+ });
183
+ return;
184
+ }
185
+ ui.panel({ title: 'Boards', size: fill }, (panel) => {
186
+ panel.list({
187
+ items: state.boards.map((board) => ({
188
+ label: `${board.current ? '* ' : ' '}${board.name} ${board.email ?? 'signed out'}`,
189
+ color: board.current ? theme.accent : undefined,
190
+ })),
191
+ selected: state.boardIndex,
192
+ followSelection: true,
193
+ });
194
+ });
195
+ }
196
+ export { selectedIndex };
197
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/tui/views.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Signing in: a magic link, a passkey, or approving a terminal.
3
+ *
4
+ * No passwords. The passkey path is progressive enhancement - the form works
5
+ * without it, and the button only appears once the script has confirmed the
6
+ * browser has WebAuthn at all.
7
+ */
8
+ import type { FC } from 'hono/jsx';
9
+ export declare const LoginPage: FC<{
10
+ sent?: string;
11
+ error?: string;
12
+ next?: string;
13
+ devLink?: string;
14
+ }>;
15
+ export declare const DevicePage: FC<{
16
+ signedIn: boolean;
17
+ code?: string;
18
+ label?: string;
19
+ done?: boolean;
20
+ error?: string;
21
+ }>;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
+ import { Alert, Card, Field } from "./layout.js";
3
+ export const LoginPage = ({ sent, error, next, devLink, }) => (_jsx("div", { style: "max-width:26rem;margin:0 auto", children: _jsxs("div", { class: "stack", children: [_jsx("h1", { children: "Sign in" }), error !== undefined && _jsx(Alert, { variant: "error", children: error }), sent !== undefined ? (_jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Check your email" }), _jsxs("p", { class: "card-description", children: ["A sign-in link is on its way to ", sent, ". It lasts 15 minutes."] })] }), devLink !== undefined && (_jsxs(_Fragment, { children: [_jsx("p", { class: "small muted", children: "No mail server is configured on this instance, so here is the link:" }), _jsx("p", { class: "small", children: _jsx("a", { href: devLink, children: devLink }) })] }))] })) : (_jsxs(_Fragment, { children: [_jsx(Card, { children: _jsxs("form", { class: "stack", method: "post", action: "/login", children: [next !== undefined && _jsx("input", { type: "hidden", name: "next", value: next }), _jsx(Field, { label: "Email", name: "email", hint: "We send a link. There is no password.", children: _jsx("input", { class: "input", type: "email", id: "email", name: "email", autocomplete: "email", required: true }) }), _jsx("button", { class: "btn btn-block", type: "submit", children: "Email me a link" })] }) }), _jsxs(Card, { id: "passkey-card", hidden: true, children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Or use a passkey" }), _jsx("p", { class: "card-description", children: "If you have already added one to this board." })] }), _jsx("button", { class: "btn btn-secondary btn-block", type: "button", id: "passkey-login", children: "Sign in with a passkey" }), _jsx("p", { class: "small error-text", id: "passkey-error", hidden: true })] })] })), _jsxs("p", { class: "small muted", children: ["Signing in from a terminal? Run ", _jsx("code", { children: "agenticjobs login" }), " and approve the code at", ' ', _jsx("a", { href: "/device", children: "/device" }), "."] })] }) }));
4
+ export const DevicePage = ({ signedIn, code, label, done, error }) => (_jsx("div", { style: "max-width:30rem;margin:0 auto", children: _jsxs("div", { class: "stack", children: [_jsx("h1", { children: "Approve a terminal" }), done === true ? (_jsxs(Alert, { variant: "success", children: [_jsx("strong", { children: "Approved." }), " The terminal that was waiting is signed in now. You can close this page."] })) : (_jsxs(_Fragment, { children: [error !== undefined && _jsx(Alert, { variant: "error", children: error }), _jsx("p", { class: "lede", children: "Type the code your terminal is showing. It signs that terminal in as you." }), !signedIn ? (_jsxs(Alert, { variant: "info", children: [_jsx("a", { href: `/login?next=${encodeURIComponent('/device')}`, children: "Sign in first" }), ", then come back here."] })) : (_jsx(Card, { children: _jsxs("form", { class: "stack", method: "post", action: "/device", children: [_jsx(Field, { label: "Code", name: "userCode", hint: label === undefined ? undefined : `From: ${label}`, children: _jsx("input", { class: "input mono", type: "text", id: "userCode", name: "userCode", value: code ?? '', placeholder: "ABCD-EFGH", autocomplete: "off", autocapitalize: "characters", spellcheck: false, required: true }) }), _jsx("button", { class: "btn btn-block", type: "submit", children: "Approve" })] }) })), _jsxs(Alert, { variant: "warning", children: ["Only approve a code you are looking at yourself. A code someone sent you signs", _jsx("em", { children: " their " }), " terminal in as ", _jsx("em", { children: " you" }), "."] })] }))] }) }));
5
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/views/auth.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The "for agents" page.
3
+ *
4
+ * A job board whose selling point is that an agent can use it has to be able
5
+ * to explain itself to one in a single fetch. This page is the human-readable
6
+ * half; llms.txt and the OpenAPI document are the other two.
7
+ */
8
+ import type { FC } from 'hono/jsx';
9
+ export declare const DocsPage: FC<{
10
+ publicUrl: string;
11
+ boardName: string;
12
+ isDirectory: boolean;
13
+ }>;
14
+ export declare const SpecPage: FC<{
15
+ title: string;
16
+ html: string;
17
+ }>;
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
+ import { Card, Prose } from "./layout.js";
3
+ export const DocsPage = ({ publicUrl, boardName, isDirectory, }) => (_jsxs("div", { class: "stack", children: [_jsxs("div", { children: [_jsx("h1", { children: "For agents" }), _jsxs("p", { class: "lede", children: ["Everything on ", boardName, " is reachable without rendering a page, and nothing here was scraped from anywhere else."] })] }), _jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h2", { class: "card-title", children: "Start here" }) }), _jsx("pre", { class: "code-block", children: `# what this board is, and where everything lives
4
+ curl ${publicUrl}/.well-known/agenticjobs
5
+
6
+ # search it
7
+ curl "${publicUrl}/api/v1/jobs?q=rust&workplace=remote"
8
+
9
+ # how to apply to one, as data
10
+ curl ${publicUrl}/api/v1/jobs/SLUG/apply-schema` })] }), _jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Applying" }), _jsx("p", { class: "card-description", children: "Two requests. Read the schema, post the answers back." })] }), _jsx("pre", { class: "code-block", children: `curl -X POST ${publicUrl}/api/v1/jobs/SLUG/apply \\
11
+ -H 'content-type: application/json' \\
12
+ -d '{
13
+ "name": "Ada Lovelace",
14
+ "email": "ada@example.com",
15
+ "cover": "Why me, briefly.",
16
+ "resume": "# Ada Lovelace\\n\\n- **Email**: ada@example.com\\n\\n## Experience\\n...",
17
+ "agent": { "name": "claude-opus-5", "supervised": true }
18
+ }'` }), _jsxs("p", { class: "small", children: ["The ", _jsx("code", { children: "agent" }), " field is the one that matters. Every listing declares an", ' ', _jsx("strong", { children: "agent policy" }), " - ", _jsx("code", { children: "welcome" }), ", ", _jsx("code", { children: "disclose" }), " or", ' ', _jsx("code", { children: "human-only" }), " - and the schema endpoint tells you which. Disclosing costs a candidate nothing on a board that asked for it; not disclosing is what gets applications thrown away everywhere else."] })] }), _jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "MCP" }), _jsx("p", { class: "card-description", children: "The same board, as tools. The tools call the REST API, so they get the same permission checks a browser gets." })] }), _jsx("pre", { class: "code-block", children: `# streamable HTTP
19
+ ${publicUrl}/api/mcp
20
+
21
+ # or over stdio
22
+ npx -y @profullstack/agenticjobs-mcp --server ${publicUrl}` }), _jsxs("p", { class: "small muted", children: ["In Claude Code: ", _jsxs("code", { children: ["claude mcp add jobs -- npx -y @profullstack/agenticjobs-mcp --server ", publicUrl] })] })] }), _jsxs(Card, { children: [_jsxs("div", { class: "card-header", children: [_jsx("h2", { class: "card-title", children: "Resumes are Markdown" }), _jsxs("p", { class: "card-description", children: ["OpenResume.md: an h1 with the name, a bullet list of contact details, then ", _jsx("code", { children: "##" }), ' ', "sections and ", _jsx("code", { children: "###" }), " entries."] })] }), _jsx(Prose, { html: `<pre><code># Ada Lovelace
23
+
24
+ - **Email**: ada@example.com
25
+ - **Location**: London
26
+
27
+ ## Experience
28
+
29
+ ### Analytical Engine | London
30
+ Chief Programmer (1842 - 1843)
31
+
32
+ - Wrote the first published algorithm intended for a machine.
33
+ </code></pre>` }), _jsxs("p", { class: "small", children: ["You can also upload a PDF or a Word document and get Markdown back from", ' ', _jsx("code", { children: "POST /api/v1/resumes/import" }), ". The Markdown is what is kept - the upload is an import step, not a storage format."] }), _jsxs("p", { class: "small", children: [_jsx("a", { href: "/docs/openresume", children: "The OpenResume.md convention in full" }), " -", ' ', _jsx("a", { href: "/docs/openjob", children: "OpenJob, the listing format" })] })] }), _jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h2", { class: "card-title", children: "Terminals" }) }), _jsx("pre", { class: "code-block", children: `npm i -g @profullstack/agenticjobs
34
+ agenticjobs login ${publicUrl}
35
+ agenticjobs search "staff engineer" --remote
36
+ agenticjobs apply SLUG --resume ~/resume.md
37
+ agenticjobs tui` }), _jsx("p", { class: "small muted", children: "Sign-in is the device flow: the terminal shows a code, you approve it in a browser, and no credential crosses the terminal. Several boards can be signed in at once." })] }), isDirectory && (_jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h2", { class: "card-title", children: "The whole network at once" }) }), _jsx("pre", { class: "code-block", children: `curl "${publicUrl}/api/v1/directory/search?q=rust"
38
+ curl ${publicUrl}/api/v1/directory/instances` }), _jsxs("p", { class: "small muted", children: ["Results carry the board they came from, and a board that failed to answer is reported in", ' ', _jsx("code", { children: "sources" }), " rather than silently left out of the count."] })] })), _jsxs(Card, { children: [_jsx("div", { class: "card-header", children: _jsx("h2", { class: "card-title", children: "The rules this board keeps" }) }), _jsxs("ul", { class: "small", children: [_jsxs("li", { children: [_jsx("strong", { children: "Reads need no key." }), " A board whose listings need a credential is a board no agent will ever read."] }), _jsxs("li", { children: [_jsx("strong", { children: "Nothing is scraped." }), " Every listing was posted here by someone who chose to be here, so an empty search means nobody posted that job, not that the crawler missed it."] }), _jsxs("li", { children: [_jsx("strong", { children: "Errors are sentences." }), " Half the callers are models; a bare 400 is not an answer."] }), _jsxs("li", { children: [_jsx("strong", { children: "A posted job starts as a draft" }), " unless the caller explicitly asks for it to go live."] })] })] })] }));
39
+ export const SpecPage = ({ title, html }) => (_jsxs("article", { class: "stack", children: [_jsx("h1", { children: title }), _jsx(Prose, { html: html })] }));
40
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/views/docs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The job list, one job, and the application form.
3
+ */
4
+ import type { FC } from 'hono/jsx';
5
+ import type { Job, JobPage, JobQuery, Organisation } from '../schema/index.ts';
6
+ export declare const JobCard: FC<{
7
+ job: Job;
8
+ origin?: string;
9
+ instanceName?: string;
10
+ }>;
11
+ export declare const Filters: FC<{
12
+ query: JobQuery;
13
+ action?: string;
14
+ }>;
15
+ export declare const Pagination: FC<{
16
+ page: JobPage<unknown>;
17
+ query: JobQuery;
18
+ base?: string;
19
+ }>;
20
+ export declare const JobList: FC<{
21
+ page: JobPage<Job>;
22
+ query: JobQuery;
23
+ boardName: string;
24
+ tagline: string;
25
+ }>;
26
+ export declare const JobDetail: FC<{
27
+ job: Job;
28
+ html: string;
29
+ publicUrl: string;
30
+ applied?: boolean;
31
+ problems?: {
32
+ field: string;
33
+ message: string;
34
+ }[];
35
+ values?: Record<string, string>;
36
+ signedIn: boolean;
37
+ resumes?: {
38
+ slug: string;
39
+ title: string;
40
+ }[];
41
+ }>;
42
+ export declare const EmployerList: FC<{
43
+ orgs: Organisation[];
44
+ }>;
45
+ export declare const EmployerDetail: FC<{
46
+ org: Organisation;
47
+ page: JobPage<Job>;
48
+ query: JobQuery;
49
+ }>;