@smartytalent/mcp-tools 0.9.56 → 0.9.57

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 (2) hide show
  1. package/dist/tools.json +84 -10
  2. package/package.json +1 -1
package/dist/tools.json CHANGED
@@ -5371,6 +5371,19 @@
5371
5371
  "maximum": 1000,
5372
5372
  "description": "Stage 3 (2026-10-06): how many people the job hires (brief.intakeContext.headcount). Written by the job build (copied); PATCH-able (an integer from 1 to 1000); null clears it."
5373
5373
  },
5374
+ "workingTime": {
5375
+ "type": "array",
5376
+ "items": {
5377
+ "type": "string",
5378
+ "enum": [
5379
+ "1/4",
5380
+ "1/2",
5381
+ "3/4",
5382
+ "full-time"
5383
+ ]
5384
+ },
5385
+ "description": "The strict first gate (S.K. 2026-10-07): the working-time fractions the hiring manager's contract offers, read off brief.employmentType by the job build (code, never a model: '1/2, 3/4 or full-time' -> the three tokens; a text naming no fraction leaves the field absent). The application form asks 'which working time?' with the four fractions and rejects a choice the job does not offer - only when the job offers a part-time fraction or several fractions (a full-time-only job keeps the minimum of fields). Not PATCH-able: a rebuild of the job reads it again."
5386
+ },
5374
5387
  "languageCode": {
5375
5388
  "type": "string",
5376
5389
  "description": "Primary language code for the job posting (e.g. en-US, pl-PL)"
@@ -6351,6 +6364,19 @@
6351
6364
  "maximum": 1000,
6352
6365
  "description": "Stage 3 (2026-10-06): how many people the job hires (brief.intakeContext.headcount). Written by the job build (copied); PATCH-able (an integer from 1 to 1000); null clears it."
6353
6366
  },
6367
+ "workingTime": {
6368
+ "type": "array",
6369
+ "items": {
6370
+ "type": "string",
6371
+ "enum": [
6372
+ "1/4",
6373
+ "1/2",
6374
+ "3/4",
6375
+ "full-time"
6376
+ ]
6377
+ },
6378
+ "description": "The strict first gate (S.K. 2026-10-07): the working-time fractions the hiring manager's contract offers, read off brief.employmentType by the job build (code, never a model: '1/2, 3/4 or full-time' -> the three tokens; a text naming no fraction leaves the field absent). The application form asks 'which working time?' with the four fractions and rejects a choice the job does not offer - only when the job offers a part-time fraction or several fractions (a full-time-only job keeps the minimum of fields). Not PATCH-able: a rebuild of the job reads it again."
6379
+ },
6354
6380
  "languageCode": {
6355
6381
  "type": "string",
6356
6382
  "description": "Primary language code for the job posting (e.g. en-US, pl-PL)"
@@ -7439,7 +7465,8 @@
7439
7465
  },
7440
7466
  "meta": {
7441
7467
  "type": "object",
7442
- "additionalProperties": true
7468
+ "additionalProperties": true,
7469
+ "description": "The analysis' record on the row. `verdict` (verdict-v1): band, code, the must outcomes (`must.met[]` with `reason: formDeclared | declaredOnly`, `must.failed[]`, `must.unverified[]`, `must.toClarify[]` = the salary without a figure), and - the screening package A, 2026-10-07 - the card's flags `verdict.declaredOnly[]` (musts met on the application form's word alone), `verdict.noReadableDocument` (the document gave the extraction nothing), `verdict.salaryToClarify` (no salary figure on the candidate's side, or the salary scale's 3: 5-20% above the ceiling or more than 5% below the floor), `verdict.formSetAside[]` (the criteria whose application-form answer RecOps set aside when it ordered the analysis past the knockout - the CV decided them; `must.unverified[]` entries with `reason: formSetAside` where the CV said nothing about the requirement; the answers and the reason are in `knockoutReleased`). `knockoutFailure.failures[]` (a row the form rejected: `fieldId`, `verifies`, `expected`, `actual`; package B adds `label`, `answerLabel`, `expectedLabel` in the job's language - the reason RecOps reads). `knockoutReleased` (package B: RecOps' candidates:analyze past the form's knockout - `by`, `at`, `taskId`, `reason`, `knockout {failures, band}`, `submissionId` = the application released; kept after the analysis, while `decision` reads `analyzeAnyway` only until the verdict's decision replaces it; a later re-application keeps the key, so the current application was analysed past the knockout only when `submissionId` equals `lastSubmissionId`). `decision`, `mandatoryCheck`, `provenance`, `lastSubmissionId` and the arc keys as before."
7443
7470
  }
7444
7471
  }
7445
7472
  },
@@ -7498,6 +7525,26 @@
7498
7525
  },
7499
7526
  "id": {
7500
7527
  "type": "string"
7528
+ },
7529
+ "meta": {
7530
+ "title": "CandidateFileLinkMetaSchema",
7531
+ "type": "object",
7532
+ "description": "Plan #2 (S.K. 2026-10-08): the state of this file OF THE APPLICATION - every file of it is linked, read or not; its type is the file's own `type`. Absent on links written before.",
7533
+ "properties": {
7534
+ "status": {
7535
+ "type": "string",
7536
+ "enum": [
7537
+ "read",
7538
+ "notRead",
7539
+ "failed"
7540
+ ],
7541
+ "description": "read = the CV, or an evidence document the document reader read; notRead = typed, not read for facts; failed = the file failed or was refused."
7542
+ },
7543
+ "reason": {
7544
+ "type": "string",
7545
+ "description": "notRead: limit (an evidence document past the reader's 5) | secondCv | identityDocument | noFactSource (a cover letter, references, the rest); failed: the file's error code (DOCUMENT_TOO_LARGE, UNSUPPORTED_FORMAT, CONVERSION_FAILED, DOCUMENT_UNREADABLE, FILE_ANALYSIS_FAILED)."
7546
+ }
7547
+ }
7501
7548
  }
7502
7549
  }
7503
7550
  }
@@ -8086,7 +8133,8 @@
8086
8133
  },
8087
8134
  "meta": {
8088
8135
  "type": "object",
8089
- "additionalProperties": true
8136
+ "additionalProperties": true,
8137
+ "description": "The analysis' record on the row. `verdict` (verdict-v1): band, code, the must outcomes (`must.met[]` with `reason: formDeclared | declaredOnly`, `must.failed[]`, `must.unverified[]`, `must.toClarify[]` = the salary without a figure), and - the screening package A, 2026-10-07 - the card's flags `verdict.declaredOnly[]` (musts met on the application form's word alone), `verdict.noReadableDocument` (the document gave the extraction nothing), `verdict.salaryToClarify` (no salary figure on the candidate's side, or the salary scale's 3: 5-20% above the ceiling or more than 5% below the floor), `verdict.formSetAside[]` (the criteria whose application-form answer RecOps set aside when it ordered the analysis past the knockout - the CV decided them; `must.unverified[]` entries with `reason: formSetAside` where the CV said nothing about the requirement; the answers and the reason are in `knockoutReleased`). `knockoutFailure.failures[]` (a row the form rejected: `fieldId`, `verifies`, `expected`, `actual`; package B adds `label`, `answerLabel`, `expectedLabel` in the job's language - the reason RecOps reads). `knockoutReleased` (package B: RecOps' candidates:analyze past the form's knockout - `by`, `at`, `taskId`, `reason`, `knockout {failures, band}`, `submissionId` = the application released; kept after the analysis, while `decision` reads `analyzeAnyway` only until the verdict's decision replaces it; a later re-application keeps the key, so the current application was analysed past the knockout only when `submissionId` equals `lastSubmissionId`). `decision`, `mandatoryCheck`, `provenance`, `lastSubmissionId` and the arc keys as before."
8090
8138
  }
8091
8139
  }
8092
8140
  },
@@ -8145,6 +8193,26 @@
8145
8193
  },
8146
8194
  "id": {
8147
8195
  "type": "string"
8196
+ },
8197
+ "meta": {
8198
+ "title": "CandidateFileLinkMetaSchema",
8199
+ "type": "object",
8200
+ "description": "Plan #2 (S.K. 2026-10-08): the state of this file OF THE APPLICATION - every file of it is linked, read or not; its type is the file's own `type`. Absent on links written before.",
8201
+ "properties": {
8202
+ "status": {
8203
+ "type": "string",
8204
+ "enum": [
8205
+ "read",
8206
+ "notRead",
8207
+ "failed"
8208
+ ],
8209
+ "description": "read = the CV, or an evidence document the document reader read; notRead = typed, not read for facts; failed = the file failed or was refused."
8210
+ },
8211
+ "reason": {
8212
+ "type": "string",
8213
+ "description": "notRead: limit (an evidence document past the reader's 5) | secondCv | identityDocument | noFactSource (a cover letter, references, the rest); failed: the file's error code (DOCUMENT_TOO_LARGE, UNSUPPORTED_FORMAT, CONVERSION_FAILED, DOCUMENT_UNREADABLE, FILE_ANALYSIS_FAILED)."
8214
+ }
8215
+ }
8148
8216
  }
8149
8217
  }
8150
8218
  }
@@ -8504,7 +8572,8 @@
8504
8572
  "type": "string"
8505
8573
  },
8506
8574
  "status": {
8507
- "type": "string"
8575
+ "type": "string",
8576
+ "description": "pending | uploaded | success | failed | archived. `failed` = the conversion or the analysis failed, or the file was REFUSED at intake (plan #2 P2: too large / an unsupported format) - meta.failure says which."
8508
8577
  },
8509
8578
  "extension": {
8510
8579
  "type": "string"
@@ -8519,7 +8588,8 @@
8519
8588
  "type": "string"
8520
8589
  },
8521
8590
  "type": {
8522
- "type": "string"
8591
+ "type": "string",
8592
+ "description": "The document's type as the file reader classified it (plan #2): resume, coverLetter, certificate (diplomas included), licence (a driving licence, a driver card), identityDocument (an ID card, a passport, a residence card), referenceLetter, portfolio, assessmentResult, jobBrief, jobDescription, document (anything else); videoRecording / audioRecording for media; undefined before the reader ran. Not an enum: rows written earlier may carry other values."
8523
8593
  },
8524
8594
  "kind": {
8525
8595
  "type": "string",
@@ -8739,7 +8809,8 @@
8739
8809
  "type": "string"
8740
8810
  },
8741
8811
  "status": {
8742
- "type": "string"
8812
+ "type": "string",
8813
+ "description": "pending | uploaded | success | failed | archived. `failed` = the conversion or the analysis failed, or the file was REFUSED at intake (plan #2 P2: too large / an unsupported format) - meta.failure says which."
8743
8814
  },
8744
8815
  "extension": {
8745
8816
  "type": "string"
@@ -8754,7 +8825,8 @@
8754
8825
  "type": "string"
8755
8826
  },
8756
8827
  "type": {
8757
- "type": "string"
8828
+ "type": "string",
8829
+ "description": "The document's type as the file reader classified it (plan #2): resume, coverLetter, certificate (diplomas included), licence (a driving licence, a driver card), identityDocument (an ID card, a passport, a residence card), referenceLetter, portfolio, assessmentResult, jobBrief, jobDescription, document (anything else); videoRecording / audioRecording for media; undefined before the reader ran. Not an enum: rows written earlier may carry other values."
8758
8830
  },
8759
8831
  "kind": {
8760
8832
  "type": "string",
@@ -9991,7 +10063,7 @@
9991
10063
  },
9992
10064
  "content": {
9993
10065
  "type": "string",
9994
- "description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label.\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
10066
+ "description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label. A `file` field may take several files: `multiple:\ntrue` and `maxFiles` (the apply form's CV field: 6 - the CV + 5\ndocuments; plan #2, S.K. 2026-10-08: no separate field, the CV is\nfound by its type).\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select; since the strict first gate\nof 2026-10-07 it may be an ARRAY of option values - any of them\npasses: the weekends select 0-4 gating at the job's minimum, the\nworking-time select 1/4 / 1/2 / 3/4 / full-time gating on the\nfractions the job offers; the experience select gates on\n`{N}-years-or-more` aligned to the job's minimum). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
9995
10067
  },
9996
10068
  "publish": {
9997
10069
  "type": "boolean",
@@ -10134,7 +10206,7 @@
10134
10206
  },
10135
10207
  "content": {
10136
10208
  "type": "string",
10137
- "description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label.\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
10209
+ "description": "The field schema, JSON-encoded: a flat map of `fieldId -> field`.\nA field carries `label` and `description` as locale maps, a\n`type` (text, textarea, select, checkbox, file, email, phone,\ndate, number), `required`, and for a select an `options` list of\n`{value, label}` - the candidate submits `value`, never the\nlocalized label. A `file` field may take several files: `multiple:\ntrue` and `maxFiles` (the apply form's CV field: 6 - the CV + 5\ndocuments; plan #2, S.K. 2026-10-08: no separate field, the CV is\nfound by its type).\n\nA knockout field adds `knockout: true`, `verifies` (the criterion\nit gates on) and `expectedAnswer` (the PASSING answer, matching\none of the option values for a select; since the strict first gate\nof 2026-10-07 it may be an ARRAY of option values - any of them\npasses: the weekends select 0-4 gating at the job's minimum, the\nworking-time select 1/4 / 1/2 / 3/4 / full-time gating on the\nfractions the job offers; the experience select gates on\n`{N}-years-or-more` aligned to the job's minimum). The submission gate\nrejects a candidate on a failed knockout without any AI spend, so\na knockout missing `expectedAnswer` is refused: the gate would\nskip it and admit everyone. A knockout on a checkbox is refused\ntoo - a required checkbox renders as must-tick, so \"No\" cannot be\nexpressed and the gate could never fire.\n\nEvery label and option label must carry text in the form's\n`languageCode` or in `en-US` - the locales the apply page falls\nback to. A label that resolves in neither renders blank for the\ncandidate and is refused.\n\nAn apply form (`kind: candidateSubmission`) must keep the\n`fullName`, `email`, `phone` and `cv` fields: the apply page maps\nthem onto first-class submission slots.\n\nRejections come back as one error object per violation, each with\na `source.pointer` at the offending field. Limit: 131072 bytes."
10138
10210
  },
10139
10211
  "publish": {
10140
10212
  "type": "boolean",
@@ -13880,6 +13952,8 @@
13880
13952
  },
13881
13953
  "files": {
13882
13954
  "type": "array",
13955
+ "maxItems": 10,
13956
+ "description": "The application's files (at most 10; each fileKey one the form's upload door issued - #66). The CV is found by its type (plan #2), not by its position.",
13883
13957
  "items": {
13884
13958
  "type": "object",
13885
13959
  "properties": {
@@ -18804,7 +18878,7 @@
18804
18878
  "route": {
18805
18879
  "type": "string",
18806
18880
  "maxLength": 64,
18807
- "description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row."
18881
+ "description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row. The RecOps doors on a candidate ride the same key with the candidate in `relationships.candidates` and their order in `meta`: `candidates:opinion` (`meta.override`, see the criterion's `override`), `candidates:stage` (`meta.stage`), and - the screening package B, 2026-10-07 - `candidates:analyze` (`meta.analyze {reason}`: analyse a candidate the application form knocked out; the action clears the knockout, keeps it in `meta.decision` history and runs the analysis on the pointed submission; the task closes `done`, or `failed` with the reason when the row is not a knockout)."
18808
18882
  },
18809
18883
  "kind": {
18810
18884
  "type": "string",
@@ -19113,7 +19187,7 @@
19113
19187
  "route": {
19114
19188
  "type": "string",
19115
19189
  "maxLength": 64,
19116
- "description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row."
19190
+ "description": "Workflow routing key (`namespace:verb`). The operator e-mail lane has exactly three: `emails:reply`, `emails:compose`, `emails:send` - nothing else. Optional, normalised to lowercase and shape-validated at create, stamped on the row and IMMUTABLE afterwards - a PATCH carrying route is rejected with 400. Creating a task whose route matches emails:* requires role recruiter/recops/admin/owner (hiringmanager and auditor are denied); the same gate guards a PATCH of an emails:* row. The RecOps doors on a candidate ride the same key with the candidate in `relationships.candidates` and their order in `meta`: `candidates:opinion` (`meta.override`, see the criterion's `override`), `candidates:stage` (`meta.stage`), and - the screening package B, 2026-10-07 - `candidates:analyze` (`meta.analyze {reason}`: analyse a candidate the application form knocked out; the action clears the knockout, keeps it in `meta.decision` history and runs the analysis on the pointed submission; the task closes `done`, or `failed` with the reason when the row is not a knockout)."
19117
19191
  },
19118
19192
  "kind": {
19119
19193
  "type": "string",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartytalent/mcp-tools",
3
- "version": "0.9.56",
3
+ "version": "0.9.57",
4
4
  "description": "MCP tool definitions for SmartyTalent API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",