@profullstack/agenticjobs 0.12.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.js +78 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/client/client.d.ts +44 -0
- package/dist/client/client.js +19 -0
- package/dist/client/client.js.map +1 -1
- package/dist/client/config.js +4 -3
- package/dist/client/config.js.map +1 -1
- package/dist/client/fanout.js +13 -4
- package/dist/client/fanout.js.map +1 -1
- package/dist/client/login.js +9 -2
- package/dist/client/login.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/core/agentwriter.js +22 -5
- package/dist/core/agentwriter.js.map +1 -1
- package/dist/core/applications.js +1 -1
- package/dist/core/applications.js.map +1 -1
- package/dist/core/capacity.js +7 -3
- package/dist/core/capacity.js.map +1 -1
- package/dist/core/import.js +10 -2
- package/dist/core/import.js.map +1 -1
- package/dist/core/jobs.d.ts +24 -6
- package/dist/core/jobs.js +116 -31
- package/dist/core/jobs.js.map +1 -1
- package/dist/core/recommendations.d.ts +134 -0
- package/dist/core/recommendations.js +356 -0
- package/dist/core/recommendations.js.map +1 -0
- package/dist/core/updates.d.ts +15 -3
- package/dist/core/updates.js +58 -24
- package/dist/core/updates.js.map +1 -1
- package/dist/core/zip.js +29 -4
- package/dist/core/zip.js.map +1 -1
- package/dist/directory/federate.js +3 -1
- package/dist/directory/federate.js.map +1 -1
- package/dist/directory/fetch.d.ts +1 -1
- package/dist/markup/markdown.js +2 -1
- package/dist/markup/markdown.js.map +1 -1
- package/dist/markup/resume.js +18 -5
- package/dist/markup/resume.js.map +1 -1
- package/dist/mcp/tools.js +99 -7
- package/dist/mcp/tools.js.map +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/instance.js +29 -0
- package/dist/schema/instance.js.map +1 -1
- package/dist/schema/job.d.ts +12 -0
- package/dist/schema/job.js +17 -3
- package/dist/schema/job.js.map +1 -1
- package/dist/schema/jsonld.js +7 -6
- package/dist/schema/jsonld.js.map +1 -1
- package/dist/schema/pay.d.ts +173 -0
- package/dist/schema/pay.js +668 -0
- package/dist/schema/pay.js.map +1 -0
- package/dist/schema/query.js +1 -1
- package/dist/schema/query.js.map +1 -1
- package/dist/server/app.js +3 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/middleware.d.ts +11 -1
- package/dist/server/middleware.js +18 -3
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/routes/api.js +153 -7
- package/dist/server/routes/api.js.map +1 -1
- package/dist/server/routes/discovery.js +10 -8
- package/dist/server/routes/discovery.js.map +1 -1
- package/dist/server/routes/openapi.js +136 -2
- package/dist/server/routes/openapi.js.map +1 -1
- package/dist/server/routes/pages.js +155 -14
- package/dist/server/routes/pages.js.map +1 -1
- package/dist/tui/views.js +9 -3
- package/dist/tui/views.js.map +1 -1
- package/dist/views/candidates.d.ts +6 -0
- package/dist/views/candidates.js +2 -1
- package/dist/views/candidates.js.map +1 -1
- package/dist/views/inbox.js +6 -6
- package/dist/views/inbox.js.map +1 -1
- package/dist/views/jobs.d.ts +16 -0
- package/dist/views/jobs.js +33 -11
- package/dist/views/jobs.js.map +1 -1
- package/dist/views/layout.d.ts +22 -0
- package/dist/views/layout.js +18 -0
- package/dist/views/layout.js.map +1 -1
- package/dist/views/me.d.ts +7 -0
- package/dist/views/me.js +3 -2
- package/dist/views/me.js.map +1 -1
- package/dist/views/post.d.ts +18 -0
- package/dist/views/post.js +39 -7
- package/dist/views/post.js.map +1 -1
- package/dist/views/recommendations.d.ts +43 -0
- package/dist/views/recommendations.js +26 -0
- package/dist/views/recommendations.js.map +1 -0
- package/dist/views/updates.js +5 -5
- package/dist/views/updates.js.map +1 -1
- package/docs/openjob.md +63 -0
- package/migrations/0015_pay_lines.sql +38 -0
- package/migrations/0016_recommendations.sql +65 -0
- package/package.json +1 -1
- package/web/public/app.css +60 -5
- package/web/public/sw.js +6 -2
package/dist/schema/index.js
CHANGED
package/dist/schema/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
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;AAC9B,cAAc,UAAU,CAAC"}
|
package/dist/schema/instance.js
CHANGED
|
@@ -56,10 +56,39 @@ export function publishable(raw) {
|
|
|
56
56
|
// Unique local addresses, fc00::/7.
|
|
57
57
|
if (/^f[cd][0-9a-f]{2}:/.test(host))
|
|
58
58
|
return null;
|
|
59
|
+
// URL canonicalises dotted IPv4 tails to hexadecimal, for example
|
|
60
|
+
// ::ffff:127.0.0.1 becomes ::ffff:7f00:1. Check both mapped and the older
|
|
61
|
+
// compatible form so IPv6 spelling cannot bypass the IPv4 private-range
|
|
62
|
+
// guards above.
|
|
63
|
+
const embedded = embeddedIpv4(host);
|
|
64
|
+
if (embedded !== null && privateIpv4(embedded))
|
|
65
|
+
return null;
|
|
66
|
+
// Unspecified and link-local IPv6 addresses are no more publishable than
|
|
67
|
+
// 0.0.0.0 and 169.254/16.
|
|
68
|
+
if (host === '::' || /^fe[89ab][0-9a-f]:/.test(host))
|
|
69
|
+
return null;
|
|
59
70
|
// Only the origin is ever kept. A path, a query or credentials in the URL
|
|
60
71
|
// would all end up concatenated onto endpoint paths later.
|
|
61
72
|
return new URL(url.origin);
|
|
62
73
|
}
|
|
74
|
+
function embeddedIpv4(host) {
|
|
75
|
+
if (!host.startsWith('::ffff:') && !host.startsWith('::'))
|
|
76
|
+
return null;
|
|
77
|
+
const match = /(?:^|:)([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(host);
|
|
78
|
+
if (match === null)
|
|
79
|
+
return null;
|
|
80
|
+
const high = Number.parseInt(match[1] ?? '', 16);
|
|
81
|
+
const low = Number.parseInt(match[2] ?? '', 16);
|
|
82
|
+
return [high >>> 8, high & 0xff, low >>> 8, low & 0xff];
|
|
83
|
+
}
|
|
84
|
+
function privateIpv4([a, b]) {
|
|
85
|
+
return (a === 0 ||
|
|
86
|
+
a === 10 ||
|
|
87
|
+
a === 127 ||
|
|
88
|
+
(a === 169 && b === 254) ||
|
|
89
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
90
|
+
(a === 192 && b === 168));
|
|
91
|
+
}
|
|
63
92
|
const MAX_NAME = 80;
|
|
64
93
|
const MAX_TAGLINE = 200;
|
|
65
94
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/schema/instance.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AA8C1D,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAEvE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAChG,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,2EAA2E;IAC3E,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,oCAAoC;IACpC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/schema/instance.ts"],"names":[],"mappings":"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"}
|
package/dist/schema/job.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* this, which is why the enumerations are string unions with runtime guards
|
|
9
9
|
* rather than TypeScript enums nobody else can see.
|
|
10
10
|
*/
|
|
11
|
+
import type { Pay } from './pay.ts';
|
|
11
12
|
export declare const EMPLOYMENT_TYPES: readonly ["full-time", "part-time", "contract", "internship", "temporary"];
|
|
12
13
|
export type EmploymentType = (typeof EMPLOYMENT_TYPES)[number];
|
|
13
14
|
export declare const WORKPLACES: readonly ["remote", "hybrid", "onsite"];
|
|
@@ -72,6 +73,17 @@ export interface Job {
|
|
|
72
73
|
location: string | null;
|
|
73
74
|
/** ISO 3166-1 alpha-2 codes a remote hire may sit in. Empty means anywhere. */
|
|
74
75
|
remoteRegions: string[];
|
|
76
|
+
/**
|
|
77
|
+
* What it pays, in full: every line, the settlement method, equity, or the
|
|
78
|
+
* statement that it is unpaid. This is the field to read and to write.
|
|
79
|
+
*/
|
|
80
|
+
pay: Pay;
|
|
81
|
+
/**
|
|
82
|
+
* The first time-based pay line, flattened. Kept for readers written
|
|
83
|
+
* against 0.11 and earlier, for the salary filter and sort, and for the
|
|
84
|
+
* JobPosting structured data, all of which compare on an annual basis. A
|
|
85
|
+
* listing that pays per task has a null range here and its pay in `pay`.
|
|
86
|
+
*/
|
|
75
87
|
salary: Salary;
|
|
76
88
|
tags: string[];
|
|
77
89
|
stack: string[];
|
package/dist/schema/job.js
CHANGED
|
@@ -16,7 +16,15 @@ export const EMPLOYMENT_TYPES = [
|
|
|
16
16
|
'temporary',
|
|
17
17
|
];
|
|
18
18
|
export const WORKPLACES = ['remote', 'hybrid', 'onsite'];
|
|
19
|
-
export const SENIORITIES = [
|
|
19
|
+
export const SENIORITIES = [
|
|
20
|
+
'intern',
|
|
21
|
+
'junior',
|
|
22
|
+
'mid',
|
|
23
|
+
'senior',
|
|
24
|
+
'staff',
|
|
25
|
+
'principal',
|
|
26
|
+
'lead',
|
|
27
|
+
];
|
|
20
28
|
export const SALARY_PERIODS = ['hour', 'day', 'week', 'month', 'year'];
|
|
21
29
|
export const JOB_STATUSES = ['draft', 'published', 'closed'];
|
|
22
30
|
/**
|
|
@@ -36,14 +44,20 @@ export const DEFAULT_APPLY_SCHEMA = {
|
|
|
36
44
|
fields: [
|
|
37
45
|
{ name: 'name', label: 'Your name', type: 'text', required: true, maxLength: 120 },
|
|
38
46
|
{ name: 'email', label: 'Email', type: 'email', required: true, maxLength: 200 },
|
|
39
|
-
{
|
|
47
|
+
{
|
|
48
|
+
name: 'url',
|
|
49
|
+
label: 'Portfolio, GitHub or LinkedIn',
|
|
50
|
+
type: 'url',
|
|
51
|
+
required: false,
|
|
52
|
+
maxLength: 500,
|
|
53
|
+
},
|
|
40
54
|
{
|
|
41
55
|
name: 'cover',
|
|
42
56
|
label: 'Why you',
|
|
43
57
|
type: 'textarea',
|
|
44
58
|
required: true,
|
|
45
59
|
maxLength: 5000,
|
|
46
|
-
help: '
|
|
60
|
+
help: 'Short is fine.',
|
|
47
61
|
},
|
|
48
62
|
],
|
|
49
63
|
};
|
package/dist/schema/job.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../src/schema/job.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../src/schema/job.ts"],"names":[],"mappings":"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"}
|
package/dist/schema/jsonld.js
CHANGED
|
@@ -60,15 +60,16 @@ export function jobPostingJsonLd(job, origin) {
|
|
|
60
60
|
}
|
|
61
61
|
const salary = job.salary;
|
|
62
62
|
if (salary.min !== null || salary.max !== null) {
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
// An absent endpoint is an open bound, not an exact salary. Keep it
|
|
64
|
+
// absent in both representations instead of copying the other endpoint.
|
|
65
|
+
const { min, max } = salary;
|
|
65
66
|
doc['baseSalary'] = {
|
|
66
67
|
'@type': 'MonetaryAmount',
|
|
67
68
|
currency: salary.currency.toUpperCase(),
|
|
68
69
|
value: {
|
|
69
70
|
'@type': 'QuantitativeValue',
|
|
70
|
-
minValue: min,
|
|
71
|
-
maxValue: max,
|
|
71
|
+
...(min !== null ? { minValue: min } : {}),
|
|
72
|
+
...(max !== null ? { maxValue: max } : {}),
|
|
72
73
|
unitText: salary.period.toUpperCase(),
|
|
73
74
|
},
|
|
74
75
|
};
|
|
@@ -77,8 +78,8 @@ export function jobPostingJsonLd(job, origin) {
|
|
|
77
78
|
currency: salary.currency.toUpperCase(),
|
|
78
79
|
value: {
|
|
79
80
|
'@type': 'QuantitativeValue',
|
|
80
|
-
minValue: Math.round(
|
|
81
|
-
maxValue: Math.round(
|
|
81
|
+
...(min !== null ? { minValue: Math.round(min * (PER_YEAR[salary.period] ?? 1)) } : {}),
|
|
82
|
+
...(max !== null ? { maxValue: Math.round(max * (PER_YEAR[salary.period] ?? 1)) } : {}),
|
|
82
83
|
unitText: 'YEAR',
|
|
83
84
|
},
|
|
84
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/schema/jsonld.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/schema/jsonld.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a listing pays, in the words people use to say it.
|
|
3
|
+
*
|
|
4
|
+
* A salary range per year was the whole vocabulary, and it described one
|
|
5
|
+
* kind of work. The listings this board is for pay per task, per pull
|
|
6
|
+
* request, per social post, a flat fee for a project, a share of revenue, or
|
|
7
|
+
* a bounty, in dollars or in a coin, settled over whatever rail the two sides
|
|
8
|
+
* agree on. ugig.net has carried that vocabulary for a year (`budget_type`,
|
|
9
|
+
* `budget_unit`, `payment_coin`) and this is the same model, so a gig there
|
|
10
|
+
* and a job here describe pay the same way and a shared package can lift it
|
|
11
|
+
* later without either side changing shape.
|
|
12
|
+
*
|
|
13
|
+
* Three ideas, kept apart on purpose:
|
|
14
|
+
*
|
|
15
|
+
* - A LINE is one price: an amount or range, what it is per, and what it
|
|
16
|
+
* is denominated in. A listing may carry several: "$0.25 per task" and
|
|
17
|
+
* "$0.25 per PR that fixes a bug" are two lines, not one with a note.
|
|
18
|
+
* - The DENOMINATION is what the number is written in: USD, EUR, or a
|
|
19
|
+
* ticker such as SOL. "$0.25 per task" is denominated in dollars even
|
|
20
|
+
* when it is paid in SOL.
|
|
21
|
+
* - The METHOD is the rail it is settled over: SOL, USDC, a bank transfer,
|
|
22
|
+
* PayPal, payroll. One per listing, separate from the price, because
|
|
23
|
+
* "$100 an hour paid in USDC" is one rate with a preference, not two
|
|
24
|
+
* rates - the number does not change because the rail did.
|
|
25
|
+
*
|
|
26
|
+
* Everything here is text in, text out. A person types "$0.25 per task", an
|
|
27
|
+
* agent sends the same string, the front matter of a job file carries it as a
|
|
28
|
+
* list, and the page prints it back. The structured form is what the API
|
|
29
|
+
* serves, but the string is what everybody writes, so the parser is the
|
|
30
|
+
* feature and the JSON is its shadow.
|
|
31
|
+
*
|
|
32
|
+
* No imports from the rest of the board: this file is meant to be lifted into
|
|
33
|
+
* a shared package with ugig.net and CoinPay behind it.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* The kinds of price. The same list ugig.net's `budget_type` carries, in the
|
|
37
|
+
* same spelling, so a value round-trips between the two boards untouched.
|
|
38
|
+
*
|
|
39
|
+
* hourly … yearly a rate per unit of time
|
|
40
|
+
* fixed a flat fee for the whole engagement
|
|
41
|
+
* per_task a price per task, the unit being "task"
|
|
42
|
+
* per_unit a price per anything else, named in `unit`
|
|
43
|
+
* revenue_share a percentage; min and max are percentages
|
|
44
|
+
* bounty a fixed payout for an accepted submission
|
|
45
|
+
*/
|
|
46
|
+
export declare const PAY_TYPES: readonly ["hourly", "daily", "weekly", "monthly", "yearly", "fixed", "per_task", "per_unit", "revenue_share", "bounty"];
|
|
47
|
+
export type PayType = (typeof PAY_TYPES)[number];
|
|
48
|
+
/**
|
|
49
|
+
* Coins a listing is commonly settled in. ugig.net's list, which is the set
|
|
50
|
+
* CoinPay can take payment in; Lightning and on-chain BTC are deliberately
|
|
51
|
+
* not on it because CoinPay cannot settle them. The method field is free
|
|
52
|
+
* text and accepts anything, so this list only drives the suggestions in a
|
|
53
|
+
* form and the upper-casing of a ticker somebody typed in lowercase.
|
|
54
|
+
*/
|
|
55
|
+
export declare const PAYMENT_COINS: readonly ["SOL", "ETH", "USDC", "USDT", "POL"];
|
|
56
|
+
/** Rails that are not coins, offered beside them in a form. */
|
|
57
|
+
export declare const PAYMENT_RAILS: readonly ["bank transfer", "PayPal", "payroll", "card", "invoice"];
|
|
58
|
+
export interface PayLine {
|
|
59
|
+
type: PayType;
|
|
60
|
+
/** Bottom of the range, or the only figure. Percent for revenue_share. */
|
|
61
|
+
min: number | null;
|
|
62
|
+
/** Top of the range. Null for a single figure or an open-ended floor. */
|
|
63
|
+
max: number | null;
|
|
64
|
+
/** What the figure is written in: an ISO code or a ticker. `%` for a share. */
|
|
65
|
+
currency: string;
|
|
66
|
+
/** For per_task and per_unit: what one of them is. Null otherwise. */
|
|
67
|
+
unit: string | null;
|
|
68
|
+
}
|
|
69
|
+
export interface Pay {
|
|
70
|
+
lines: PayLine[];
|
|
71
|
+
/** How it is settled: a coin such as SOL, or a rail such as "bank transfer". */
|
|
72
|
+
method: string | null;
|
|
73
|
+
/** Free text, "0.1% - 0.4%". Never parsed. */
|
|
74
|
+
equity: string | null;
|
|
75
|
+
/**
|
|
76
|
+
* The role pays nothing, and the employer is saying so. Distinct from an
|
|
77
|
+
* empty `lines`, which means nobody filled the field in.
|
|
78
|
+
*/
|
|
79
|
+
unpaid: boolean;
|
|
80
|
+
}
|
|
81
|
+
export declare const EMPTY_PAY: Pay;
|
|
82
|
+
/** The most lines a listing can carry. Past this it is a rate card, not a job. */
|
|
83
|
+
export declare const PAY_LINES_MAX = 8;
|
|
84
|
+
/** The longest a per-unit description can be: "PR that fixes a bug you find". */
|
|
85
|
+
export declare const UNIT_MAX = 60;
|
|
86
|
+
export declare const METHOD_MAX = 40;
|
|
87
|
+
export declare const EQUITY_MAX = 60;
|
|
88
|
+
export declare const isFiat: (code: string) => boolean;
|
|
89
|
+
export declare const isKnownCurrency: (code: string) => boolean;
|
|
90
|
+
/** The period word for a time-based line, or null for every other kind. */
|
|
91
|
+
export declare function periodOf(type: PayType): 'hour' | 'day' | 'week' | 'month' | 'year' | null;
|
|
92
|
+
export declare function isPayType(value: unknown): value is PayType;
|
|
93
|
+
/** How a pay line is written, for every error message that has to explain it. */
|
|
94
|
+
export declare const PAY_LINE_EXAMPLES = "\"$0.25 per task\", \"$120k - $150k a year\", \"$100 an hour\", \"$5000 fixed\", \"0.01 SOL per PR that fixes a bug\", \"10% revenue share\"";
|
|
95
|
+
/**
|
|
96
|
+
* One pay line from the way a person wrote it.
|
|
97
|
+
*
|
|
98
|
+
* Returns the line, or a sentence saying what could not be read. A sentence
|
|
99
|
+
* rather than a throw, because the caller is a form or an API handler and
|
|
100
|
+
* the person has to be told which line and what it should look like.
|
|
101
|
+
*/
|
|
102
|
+
export declare function parsePayLine(input: unknown): PayLine | string;
|
|
103
|
+
/** The line and, when the text named one, the rail it is settled over. */
|
|
104
|
+
export declare function readPayLine(input: unknown): {
|
|
105
|
+
line: PayLine;
|
|
106
|
+
method: string | null;
|
|
107
|
+
} | string;
|
|
108
|
+
/** "$0.25", "$120k", "0.01 SOL", "CAD 1,000", "10%". */
|
|
109
|
+
export declare function formatAmount(amount: number, currency: string): string;
|
|
110
|
+
/**
|
|
111
|
+
* One line, the way it is printed everywhere: the badge on a card, the CLI,
|
|
112
|
+
* the TUI, a federated result. A single endpoint is a bound rather than a
|
|
113
|
+
* fixed figure, and is labelled as one.
|
|
114
|
+
*/
|
|
115
|
+
export declare function formatPayLine(line: PayLine): string;
|
|
116
|
+
/** Every line, or "Unpaid", or null when the listing says nothing about pay. */
|
|
117
|
+
export declare function formatPay(pay: Pay): string | null;
|
|
118
|
+
/** The first line only, for a badge with one line of room. */
|
|
119
|
+
export declare function formatPayShort(pay: Pay): string | null;
|
|
120
|
+
/** "Paid in SOL", "Paid by bank transfer". */
|
|
121
|
+
export declare function formatMethod(method: string | null): string | null;
|
|
122
|
+
/** Has the employer said what it pays? Unpaid counts: it is a statement. */
|
|
123
|
+
export declare function payStated(pay: Pay): boolean;
|
|
124
|
+
export interface SalaryLike {
|
|
125
|
+
min: number | null;
|
|
126
|
+
max: number | null;
|
|
127
|
+
currency: string;
|
|
128
|
+
period: string;
|
|
129
|
+
equity?: string | null;
|
|
130
|
+
unpaid?: boolean;
|
|
131
|
+
}
|
|
132
|
+
/** A listing from a board that predates pay lines, read into the new shape. */
|
|
133
|
+
export declare function payFromSalary(salary: SalaryLike): Pay;
|
|
134
|
+
/**
|
|
135
|
+
* The time-based line a listing's `salary` columns carry, for search, sort
|
|
136
|
+
* and structured data - all of which compare on an annual basis and have no
|
|
137
|
+
* meaning for a price per task. The first time-based line wins; a listing
|
|
138
|
+
* with none has a null range, so it stays out of every salary filter.
|
|
139
|
+
*/
|
|
140
|
+
export declare function salaryFromPay(pay: Pay): {
|
|
141
|
+
min: number | null;
|
|
142
|
+
max: number | null;
|
|
143
|
+
currency: string;
|
|
144
|
+
period: 'hour' | 'day' | 'week' | 'month' | 'year';
|
|
145
|
+
};
|
|
146
|
+
/** A ticker typed in any case comes out in capitals; a rail stays as typed. */
|
|
147
|
+
export declare function normaliseMethod(value: unknown): string | null;
|
|
148
|
+
/**
|
|
149
|
+
* Pay, from whatever a form, an API client or a model sent.
|
|
150
|
+
*
|
|
151
|
+
* `pay` may be a string (one line, or several separated by newlines), an
|
|
152
|
+
* array of strings or of line objects, or an object with `lines` and
|
|
153
|
+
* `method`. The old flat fields - salaryMin, salaryMax, salaryCurrency,
|
|
154
|
+
* salaryPeriod, salaryUnpaid, salaryEquity - still work and become one line,
|
|
155
|
+
* so a client written against 0.11 keeps posting listings.
|
|
156
|
+
*
|
|
157
|
+
* Returns the pay, or a sentence saying which line could not be read.
|
|
158
|
+
*/
|
|
159
|
+
export declare function normalisePay(input: Record<string, unknown>): Pay | string;
|
|
160
|
+
/**
|
|
161
|
+
* The pay of any listing, including one from a board that predates `pay`.
|
|
162
|
+
*
|
|
163
|
+
* Federated search puts listings from other instances on this board's pages,
|
|
164
|
+
* and an instance still on 0.11 serves a `salary` and no `pay`. Reading
|
|
165
|
+
* `job.pay` straight would throw on those, so every display path goes
|
|
166
|
+
* through here.
|
|
167
|
+
*/
|
|
168
|
+
export declare function payOfJob(job: {
|
|
169
|
+
pay?: Pay | null;
|
|
170
|
+
salary?: SalaryLike | null;
|
|
171
|
+
}): Pay;
|
|
172
|
+
/** The lines as the text a person would type, one per line. Round-trips through parsePayLine. */
|
|
173
|
+
export declare function payToText(pay: Pay): string;
|