@smartytalent/mcp-tools 0.9.34 → 0.9.36

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 +177 -18
  2. package/package.json +1 -1
package/dist/tools.json CHANGED
@@ -166,20 +166,24 @@
166
166
  "type": "object",
167
167
  "properties": {
168
168
  "ad": {
169
- "type": "object"
169
+ "type": "object",
170
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. Ads and their images are built for every recruitment process; `enabled` never gated anything, `generateImages` is always on (the env kill switch AD_IMAGE_GENERATION remains), `platforms` were never read (the platform lists are fixed in code). Removed in a later, breaking release together with settings.feedback; declared until then because the generated model whitelists keys."
170
171
  },
171
172
  "brand": {
172
173
  "type": "object",
173
174
  "description": "Brand rules the ad and careers generators read. Split by who can\nact on what: exact colours are applied by CODE (an image model\nonly ever approximates a hex), while the look-and-feel strings\nare fed to the image prompt. Keys: primaryColor / secondaryColor\n(^#[0-9a-fA-F]{6}$), photography, avoid, tone. Freeform for now;\na dedicated brand service is the endgame once logo variants,\ntypefaces and versioning arrive."
174
175
  },
175
176
  "conversation": {
176
- "type": "object"
177
+ "type": "object",
178
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. The AI interview is part of the recruitment process (settings.automation on the job); `jobInterview.enabled` never had a reader. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
177
179
  },
178
180
  "report": {
179
- "type": "object"
181
+ "type": "object",
182
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. Reports run for EVERY active tenant (daily, weekly, monthly) and are downloaded in the report app (showReport meta.pdf); e-mail delivery is gone (a per-user preference is a later phase), so `emails` and `period` gate nothing. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
180
183
  },
181
184
  "email": {
182
- "type": "object"
185
+ "type": "object",
186
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. `domains` (trusted e-mail domains) never had a reader - inbound trust comes from the user registry and SPF/DKIM alignment. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
183
187
  },
184
188
  "operation": {
185
189
  "type": "object",
@@ -188,13 +192,48 @@
188
192
  "feedback": {
189
193
  "title": "TenantAttributesSettingsFeedbackSchema",
190
194
  "type": "object",
191
- "description": "Organisation-wide switch for outbound candidate feedback. Absent = enabled. enabled=false makes feedback:resolve return enabled=false with reason disabled:tenant BEFORE any policy lookup; default and per-job feedback rows stay stored and come back to life when re-enabled. Explicitly validated: enabled must be a JSON boolean (a string is a 400). NOTE: the generated model whitelists keys, so this property MUST be declared for the SDK to carry it.",
195
+ "description": "DEPRECATED (2026-09-24, S.K.: settings.automation.feedback is the ONE control of feedback; this field will be removed in a later, breaking release). Organisation-wide legacy switch for outbound candidate feedback: absent = enabled; enabled=false makes feedback:resolve return enabled=false with reason disabled:tenant ONLY while settings.automation.feedback is absent on both the job and the tenant - once the new key is set at either level this field is ignored; default and per-job feedback rows stay stored. Explicitly validated: enabled must be a JSON boolean (a string is a 400). NOTE: the generated model whitelists keys, so this property MUST stay declared until the removal release.",
192
196
  "properties": {
193
197
  "enabled": {
194
198
  "type": "boolean"
195
199
  }
196
200
  }
197
201
  },
202
+ "automation": {
203
+ "title": "TenantAttributesSettingsAutomationSchema",
204
+ "type": "object",
205
+ "description": "The organisation's DEFAULT automation switches (PLAN_PROCESS_AUTOMATION, 2026-09-24), the same seven keys and values as job.settings.automation: auto = Boe runs the stage, manual = a human runs it (a task on the RecOps board), off = the stage is not part of the process. A job overrides these in BOTH directions (a tenant on manual pilots auto on one job); absent = the platform default (sourcing manual, everything else auto). PATCH merges this block PER KEY (a key sent as null clears the default). Validated in code like the job block: interview and offer accept auto|manual, surveys accepts auto|off, the rest auto|manual|off. NOTE: the generated model whitelists keys, so this property MUST be declared for the SDK to carry it.",
206
+ "properties": {
207
+ "sourcing": {
208
+ "type": "string",
209
+ "description": "auto | manual | off"
210
+ },
211
+ "screeningCall": {
212
+ "type": "string",
213
+ "description": "auto | manual | off"
214
+ },
215
+ "assessment": {
216
+ "type": "string",
217
+ "description": "auto | manual | off"
218
+ },
219
+ "interview": {
220
+ "type": "string",
221
+ "description": "auto | manual"
222
+ },
223
+ "offer": {
224
+ "type": "string",
225
+ "description": "auto | manual"
226
+ },
227
+ "surveys": {
228
+ "type": "string",
229
+ "description": "auto | off"
230
+ },
231
+ "feedback": {
232
+ "type": "string",
233
+ "description": "auto | manual | off"
234
+ }
235
+ }
236
+ },
198
237
  "sso": {
199
238
  "type": "object",
200
239
  "description": "Enterprise SSO configuration. READ-ONLY here: the generic tenant PATCH strips this key, the only writers are the /v1/tenants/{tenantId}/sso doors. Sending it in a PATCH is ignored (not an error).",
@@ -703,20 +742,24 @@
703
742
  "type": "object",
704
743
  "properties": {
705
744
  "ad": {
706
- "type": "object"
745
+ "type": "object",
746
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. Ads and their images are built for every recruitment process; `enabled` never gated anything, `generateImages` is always on (the env kill switch AD_IMAGE_GENERATION remains), `platforms` were never read (the platform lists are fixed in code). Removed in a later, breaking release together with settings.feedback; declared until then because the generated model whitelists keys."
707
747
  },
708
748
  "brand": {
709
749
  "type": "object",
710
750
  "description": "Brand rules the ad and careers generators read. Split by who can\nact on what: exact colours are applied by CODE (an image model\nonly ever approximates a hex), while the look-and-feel strings\nare fed to the image prompt. Keys: primaryColor / secondaryColor\n(^#[0-9a-fA-F]{6}$), photography, avoid, tone. Freeform for now;\na dedicated brand service is the endgame once logo variants,\ntypefaces and versioning arrive."
711
751
  },
712
752
  "conversation": {
713
- "type": "object"
753
+ "type": "object",
754
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. The AI interview is part of the recruitment process (settings.automation on the job); `jobInterview.enabled` never had a reader. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
714
755
  },
715
756
  "report": {
716
- "type": "object"
757
+ "type": "object",
758
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. Reports run for EVERY active tenant (daily, weekly, monthly) and are downloaded in the report app (showReport meta.pdf); e-mail delivery is gone (a per-user preference is a later phase), so `emails` and `period` gate nothing. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
717
759
  },
718
760
  "email": {
719
- "type": "object"
761
+ "type": "object",
762
+ "description": "DEPRECATED (2026-09-24, S.K., PLAN_TENANT_SETTINGS_CLEANUP): ignored by the backend and stripped on write. `domains` (trusted e-mail domains) never had a reader - inbound trust comes from the user registry and SPF/DKIM alignment. Removed in a later, breaking release; declared until then because the generated model whitelists keys."
720
763
  },
721
764
  "operation": {
722
765
  "type": "object",
@@ -725,13 +768,48 @@
725
768
  "feedback": {
726
769
  "title": "TenantAttributesSettingsFeedbackSchema",
727
770
  "type": "object",
728
- "description": "Organisation-wide switch for outbound candidate feedback. Absent = enabled. enabled=false makes feedback:resolve return enabled=false with reason disabled:tenant BEFORE any policy lookup; default and per-job feedback rows stay stored and come back to life when re-enabled. Explicitly validated: enabled must be a JSON boolean (a string is a 400). NOTE: the generated model whitelists keys, so this property MUST be declared for the SDK to carry it.",
771
+ "description": "DEPRECATED (2026-09-24, S.K.: settings.automation.feedback is the ONE control of feedback; this field will be removed in a later, breaking release). Organisation-wide legacy switch for outbound candidate feedback: absent = enabled; enabled=false makes feedback:resolve return enabled=false with reason disabled:tenant ONLY while settings.automation.feedback is absent on both the job and the tenant - once the new key is set at either level this field is ignored; default and per-job feedback rows stay stored. Explicitly validated: enabled must be a JSON boolean (a string is a 400). NOTE: the generated model whitelists keys, so this property MUST stay declared until the removal release.",
729
772
  "properties": {
730
773
  "enabled": {
731
774
  "type": "boolean"
732
775
  }
733
776
  }
734
777
  },
778
+ "automation": {
779
+ "title": "TenantAttributesSettingsAutomationSchema",
780
+ "type": "object",
781
+ "description": "The organisation's DEFAULT automation switches (PLAN_PROCESS_AUTOMATION, 2026-09-24), the same seven keys and values as job.settings.automation: auto = Boe runs the stage, manual = a human runs it (a task on the RecOps board), off = the stage is not part of the process. A job overrides these in BOTH directions (a tenant on manual pilots auto on one job); absent = the platform default (sourcing manual, everything else auto). PATCH merges this block PER KEY (a key sent as null clears the default). Validated in code like the job block: interview and offer accept auto|manual, surveys accepts auto|off, the rest auto|manual|off. NOTE: the generated model whitelists keys, so this property MUST be declared for the SDK to carry it.",
782
+ "properties": {
783
+ "sourcing": {
784
+ "type": "string",
785
+ "description": "auto | manual | off"
786
+ },
787
+ "screeningCall": {
788
+ "type": "string",
789
+ "description": "auto | manual | off"
790
+ },
791
+ "assessment": {
792
+ "type": "string",
793
+ "description": "auto | manual | off"
794
+ },
795
+ "interview": {
796
+ "type": "string",
797
+ "description": "auto | manual"
798
+ },
799
+ "offer": {
800
+ "type": "string",
801
+ "description": "auto | manual"
802
+ },
803
+ "surveys": {
804
+ "type": "string",
805
+ "description": "auto | off"
806
+ },
807
+ "feedback": {
808
+ "type": "string",
809
+ "description": "auto | manual | off"
810
+ }
811
+ }
812
+ },
735
813
  "sso": {
736
814
  "type": "object",
737
815
  "description": "Enterprise SSO configuration. READ-ONLY here: the generic tenant PATCH strips this key, the only writers are the /v1/tenants/{tenantId}/sso doors. Sending it in a PATCH is ignored (not an error).",
@@ -5327,12 +5405,47 @@
5327
5405
  "feedback": {
5328
5406
  "title": "JobAttributesSettingsFeedbackSchema",
5329
5407
  "type": "object",
5330
- "description": "Per-job switch for outbound candidate feedback. Absent = enabled. enabled=false makes feedback:resolve return enabled=false with reason disabled:job for candidates of this job, before the job override / tenant default lookup. The tenant-level switch (tenant.settings.feedback.enabled) wins over this one. Explicitly validated: enabled must be a JSON boolean.",
5408
+ "description": "DEPRECATED (2026-09-24, S.K.: settings.automation.feedback is the ONE control of feedback; this field will be removed in a later, breaking release). Per-job legacy switch for outbound candidate feedback: absent = enabled; enabled=false makes feedback:resolve return enabled=false with reason disabled:job ONLY while settings.automation.feedback is absent on both the job and the tenant - once the new key is set at either level this field is ignored. Between the two legacy switches the tenant's wins. Explicitly validated: enabled must be a JSON boolean.",
5331
5409
  "properties": {
5332
5410
  "enabled": {
5333
5411
  "type": "boolean"
5334
5412
  }
5335
5413
  }
5414
+ },
5415
+ "automation": {
5416
+ "title": "JobAttributesSettingsAutomationSchema",
5417
+ "type": "object",
5418
+ "description": "Per-job automation switches (PLAN_PROCESS_AUTOMATION, 2026-09-24): who runs each stage of THIS recruitment process. Values per key: auto = Boe runs the stage, manual = a human runs it (Boe leaves a task on the RecOps board and waits), off = the stage is not part of this process (the candidate moves on). Every key is optional: absent = the organisation's default (tenant.settings.automation), else the platform default (sourcing manual, everything else auto); the job overrides the tenant in BOTH directions. Read by the automation:resolve action at the head of the candidate-facing workflows and by feedback:resolve (feedback). PATCH merges this block PER KEY (send one switch at a time; a key sent as null clears the override). Writable only by sysowner / owner / admin / recops - any other role gets 403 on a payload that carries it, on POST and PATCH. Validated in code: interview and offer accept auto|manual, surveys accepts auto|off, the rest auto|manual|off; an unknown key or value is a 400 naming it. `feedback` here is the ONE control of feedback e-mails (S.K. 2026-09-24): the deprecated settings.feedback.enabled counts only while this key is absent on both the job and the tenant. The job build (Create Job From Brief) never generates this block: it keeps the row's values and seeds `off` for the stages the manager declared out of the process in the intake (brief.intakeContext.process).",
5419
+ "properties": {
5420
+ "sourcing": {
5421
+ "type": "string",
5422
+ "description": "auto | manual | off. Talent-pool sourcing at job activation: auto = the matched people are invited at once, manual = a draft invitation the recops activate (the platform default), off = no pool match."
5423
+ },
5424
+ "screeningCall": {
5425
+ "type": "string",
5426
+ "description": "auto | manual | off. The SMS + AI phone screening after a passed CV screening: manual = a board task and the candidate stays at screening, off = the candidate advances to assessment (or interview when assessment is off)."
5427
+ },
5428
+ "assessment": {
5429
+ "type": "string",
5430
+ "description": "auto | manual | off. The competency test: manual = a board task and the candidate stays at assessment, off = the candidate advances to interview whatever templates exist (settings.assessment.enabled only governs template generation at build)."
5431
+ },
5432
+ "interview": {
5433
+ "type": "string",
5434
+ "description": "auto | manual. The HM consent ask and the autonomous interview booking: manual = no HM e-mail, no booking, a board task, the candidate stays at interview (the shortlist). No off in v1."
5435
+ },
5436
+ "offer": {
5437
+ "type": "string",
5438
+ "description": "auto | manual. After the HM's yes: auto = offer document draft + congratulation e-mail, manual = the stage move and the audit note only, plus a board task. No off in v1."
5439
+ },
5440
+ "surveys": {
5441
+ "type": "string",
5442
+ "description": "auto | off. cNPS surveys: off = no survey invitation after a hire and no survey link in rejection e-mails."
5443
+ },
5444
+ "feedback": {
5445
+ "type": "string",
5446
+ "description": "auto | manual | off. Candidate feedback e-mails the feedback policy allows: auto = composed, scheduled and sent by the workflow, manual = composed by Boe and HELD as a draft in the candidate's thread with a board task, released by the operator's emails:send order, off = no feedback e-mail."
5447
+ }
5448
+ }
5336
5449
  }
5337
5450
  }
5338
5451
  }
@@ -6192,12 +6305,47 @@
6192
6305
  "feedback": {
6193
6306
  "title": "JobAttributesSettingsFeedbackSchema",
6194
6307
  "type": "object",
6195
- "description": "Per-job switch for outbound candidate feedback. Absent = enabled. enabled=false makes feedback:resolve return enabled=false with reason disabled:job for candidates of this job, before the job override / tenant default lookup. The tenant-level switch (tenant.settings.feedback.enabled) wins over this one. Explicitly validated: enabled must be a JSON boolean.",
6308
+ "description": "DEPRECATED (2026-09-24, S.K.: settings.automation.feedback is the ONE control of feedback; this field will be removed in a later, breaking release). Per-job legacy switch for outbound candidate feedback: absent = enabled; enabled=false makes feedback:resolve return enabled=false with reason disabled:job ONLY while settings.automation.feedback is absent on both the job and the tenant - once the new key is set at either level this field is ignored. Between the two legacy switches the tenant's wins. Explicitly validated: enabled must be a JSON boolean.",
6196
6309
  "properties": {
6197
6310
  "enabled": {
6198
6311
  "type": "boolean"
6199
6312
  }
6200
6313
  }
6314
+ },
6315
+ "automation": {
6316
+ "title": "JobAttributesSettingsAutomationSchema",
6317
+ "type": "object",
6318
+ "description": "Per-job automation switches (PLAN_PROCESS_AUTOMATION, 2026-09-24): who runs each stage of THIS recruitment process. Values per key: auto = Boe runs the stage, manual = a human runs it (Boe leaves a task on the RecOps board and waits), off = the stage is not part of this process (the candidate moves on). Every key is optional: absent = the organisation's default (tenant.settings.automation), else the platform default (sourcing manual, everything else auto); the job overrides the tenant in BOTH directions. Read by the automation:resolve action at the head of the candidate-facing workflows and by feedback:resolve (feedback). PATCH merges this block PER KEY (send one switch at a time; a key sent as null clears the override). Writable only by sysowner / owner / admin / recops - any other role gets 403 on a payload that carries it, on POST and PATCH. Validated in code: interview and offer accept auto|manual, surveys accepts auto|off, the rest auto|manual|off; an unknown key or value is a 400 naming it. `feedback` here is the ONE control of feedback e-mails (S.K. 2026-09-24): the deprecated settings.feedback.enabled counts only while this key is absent on both the job and the tenant. The job build (Create Job From Brief) never generates this block: it keeps the row's values and seeds `off` for the stages the manager declared out of the process in the intake (brief.intakeContext.process).",
6319
+ "properties": {
6320
+ "sourcing": {
6321
+ "type": "string",
6322
+ "description": "auto | manual | off. Talent-pool sourcing at job activation: auto = the matched people are invited at once, manual = a draft invitation the recops activate (the platform default), off = no pool match."
6323
+ },
6324
+ "screeningCall": {
6325
+ "type": "string",
6326
+ "description": "auto | manual | off. The SMS + AI phone screening after a passed CV screening: manual = a board task and the candidate stays at screening, off = the candidate advances to assessment (or interview when assessment is off)."
6327
+ },
6328
+ "assessment": {
6329
+ "type": "string",
6330
+ "description": "auto | manual | off. The competency test: manual = a board task and the candidate stays at assessment, off = the candidate advances to interview whatever templates exist (settings.assessment.enabled only governs template generation at build)."
6331
+ },
6332
+ "interview": {
6333
+ "type": "string",
6334
+ "description": "auto | manual. The HM consent ask and the autonomous interview booking: manual = no HM e-mail, no booking, a board task, the candidate stays at interview (the shortlist). No off in v1."
6335
+ },
6336
+ "offer": {
6337
+ "type": "string",
6338
+ "description": "auto | manual. After the HM's yes: auto = offer document draft + congratulation e-mail, manual = the stage move and the audit note only, plus a board task. No off in v1."
6339
+ },
6340
+ "surveys": {
6341
+ "type": "string",
6342
+ "description": "auto | off. cNPS surveys: off = no survey invitation after a hire and no survey link in rejection e-mails."
6343
+ },
6344
+ "feedback": {
6345
+ "type": "string",
6346
+ "description": "auto | manual | off. Candidate feedback e-mails the feedback policy allows: auto = composed, scheduled and sent by the workflow, manual = composed by Boe and HELD as a draft in the candidate's thread with a board task, released by the operator's emails:send order, off = no feedback e-mail."
6347
+ }
6348
+ }
6201
6349
  }
6202
6350
  }
6203
6351
  }
@@ -22326,12 +22474,23 @@
22326
22474
  "properties": {
22327
22475
  "filterStatus": {
22328
22476
  "type": "string",
22329
- "description": "Returns reports with the current status (active, archived). If not provided, the default value will be set to 'active'.",
22477
+ "description": "Returns reports with the given status. Pass it explicitly - the backend applies NO default, so without it pending and failed rows come back too. The report app's history query is `filterStatus=active&sort=-created` (newest first; the status index carries the sort). One filter at a time: the backend serves a single index per request.",
22330
22478
  "enum": [
22331
22479
  "active",
22332
- "archived"
22480
+ "inactive",
22481
+ "pending",
22482
+ "archived",
22483
+ "failed"
22333
22484
  ]
22334
22485
  },
22486
+ "filterResourceId": {
22487
+ "type": "string",
22488
+ "description": "Returns the reports of ONE resource (a job id, or the tenant id for the scheduled tenant reports). Served from the ResourceIndex in index order: `sort` is IGNORED next to it, and it cannot be combined with filterStatus or the created/modified window (one filter at a time). For the tenant history use `filterStatus=active&sort=-created` instead and read `resourceType` / `period` off the rows."
22489
+ },
22490
+ "sort": {
22491
+ "type": "string",
22492
+ "description": "`created` / `-created` / `modified` / `-modified`. Honoured alone and next to filterStatus; ignored next to filterResourceId (index order) and the date windows keep their own index order."
22493
+ },
22335
22494
  "filterCreatedFrom": {
22336
22495
  "type": "string",
22337
22496
  "description": "Filters results to include only those created from the specified date and time. The value must be in ISO 8601 format."
@@ -22406,7 +22565,7 @@
22406
22565
  "properties": {
22407
22566
  "resourceId": {
22408
22567
  "type": "string",
22409
- "description": "Identifier of the resource this report is associated with (job ID or tenant ID)"
22568
+ "description": "Identifier of the resource this report is associated with: the tenant id for the scheduled tenant reports (resourceType tenants), a job id for a job report. On the wire since 2026-09-24 (it was stored but not returned)."
22410
22569
  },
22411
22570
  "resourceType": {
22412
22571
  "type": "string",
@@ -22433,7 +22592,7 @@
22433
22592
  },
22434
22593
  "settings": {
22435
22594
  "type": "string",
22436
- "description": "Report configuration including email recipients and period preferences"
22595
+ "description": "The analysis window the broker stamps at creation (startDate, endDate, reportPeriod, displayName and the period's own fields such as isoWeek or monthName). Since 2026-09-24 (PLAN_TENANT_SETTINGS_CLEANUP) no `emails`: reports are downloaded in the report app, not mailed."
22437
22596
  },
22438
22597
  "shortCode": {
22439
22598
  "type": "string",
@@ -22573,7 +22732,7 @@
22573
22732
  "properties": {
22574
22733
  "resourceId": {
22575
22734
  "type": "string",
22576
- "description": "Identifier of the resource this report is associated with (job ID or tenant ID)"
22735
+ "description": "Identifier of the resource this report is associated with: the tenant id for the scheduled tenant reports (resourceType tenants), a job id for a job report. On the wire since 2026-09-24 (it was stored but not returned)."
22577
22736
  },
22578
22737
  "resourceType": {
22579
22738
  "type": "string",
@@ -22600,7 +22759,7 @@
22600
22759
  },
22601
22760
  "settings": {
22602
22761
  "type": "string",
22603
- "description": "Report configuration including email recipients and period preferences"
22762
+ "description": "The analysis window the broker stamps at creation (startDate, endDate, reportPeriod, displayName and the period's own fields such as isoWeek or monthName). Since 2026-09-24 (PLAN_TENANT_SETTINGS_CLEANUP) no `emails`: reports are downloaded in the report app, not mailed."
22604
22763
  },
22605
22764
  "shortCode": {
22606
22765
  "type": "string",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartytalent/mcp-tools",
3
- "version": "0.9.34",
3
+ "version": "0.9.36",
4
4
  "description": "MCP tool definitions for SmartyTalent API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",