@burdenoff/mcp-libs 2026.719.1 → 2026.720.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.
@@ -507,7 +507,13 @@ function registerProgramTools(server, ctx, track) {
507
507
  {
508
508
  title: "Archive Training Program",
509
509
  description: "Archive a training program by ID. Returns true on success.",
510
- inputSchema: { id: z.string().describe("Program ID") }
510
+ inputSchema: { id: z.string().describe("Program ID") },
511
+ // BOFF-3859: ARCHIVED is a terminal lifecycle state (no transition back
512
+ // out per training.service.ts's PROGRAM_TRANSITIONS) and the resolver
513
+ // sets `deletedAt` — this is an irreversible soft-delete, not a naming
514
+ // pattern (`inferDestructiveHint` only matches `delete`), so it must be
515
+ // declared explicitly to be caught by the confirmation gate.
516
+ annotations: { destructiveHint: true }
511
517
  },
512
518
  async ({ id }) => {
513
519
  try {
@@ -1413,7 +1419,13 @@ function registerCoachingTools(server, ctx, track) {
1413
1419
  shareWorkouts: z.boolean().optional().describe("Share workout data with the coach"),
1414
1420
  shareNutrition: z.boolean().optional().describe("Share nutrition data with the coach"),
1415
1421
  shareMetrics: z.boolean().optional().describe("Share body-metric data with the coach")
1416
- }
1422
+ },
1423
+ // BOFF-3859: grants a third party (the coach) read access to a
1424
+ // member's health data via the share* flags. Not a naming-pattern
1425
+ // match for `inferDestructiveHint` (no "delete"), but it is exactly
1426
+ // the class of health-data-governance mutation the confirmation gate
1427
+ // exists for — declared explicitly rather than left ungated.
1428
+ annotations: { destructiveHint: true }
1417
1429
  },
1418
1430
  async ({ coachId, memberId, specialty, shareWorkouts, shareNutrition, shareMetrics }) => {
1419
1431
  try {
@@ -1440,7 +1452,11 @@ function registerCoachingTools(server, ctx, track) {
1440
1452
  inputSchema: {
1441
1453
  id: z.string().describe("Coaching relationship ID"),
1442
1454
  status: CoachingStatusEnum.describe("Target coaching status")
1443
- }
1455
+ },
1456
+ // BOFF-3859: activates or revokes a coach's access to shared health
1457
+ // data (ENDED is a terminal state per COACHING_TRANSITIONS) — same
1458
+ // health-data-governance rationale as coaching_create above.
1459
+ annotations: { destructiveHint: true }
1444
1460
  },
1445
1461
  async ({ id, status }) => {
1446
1462
  try {