@meltstudio/meltctl 5.28.0 → 5.29.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 (2) hide show
  1. package/dist/index.js +97 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7499,7 +7499,7 @@ var CLI_VERSION;
7499
7499
  var init_version = __esm({
7500
7500
  "src/utils/version.ts"() {
7501
7501
  "use strict";
7502
- CLI_VERSION = "5.28.0";
7502
+ CLI_VERSION = "5.29.0";
7503
7503
  }
7504
7504
  });
7505
7505
 
@@ -28047,6 +28047,35 @@ function createEndpointChecksResource(config2) {
28047
28047
  }
28048
28048
  return data.device;
28049
28049
  },
28050
+ /**
28051
+ * People exempt from the endpoint check (client-managed machines).
28052
+ * Active ones only, unless `includeInactive`. Manager-gated.
28053
+ */
28054
+ async listExemptions(includeInactive = false) {
28055
+ const query = includeInactive ? "?all=true" : "";
28056
+ const { data, status } = await apiFetch(config2, `/endpoint-checks/exemptions${query}`);
28057
+ if (status === 403) {
28058
+ throw new Error("Access denied. Only Team Managers can list endpoint exemptions.");
28059
+ }
28060
+ if (status !== 200) {
28061
+ throw new Error(data.error ?? `Failed to list endpoint exemptions (${status})`);
28062
+ }
28063
+ return data;
28064
+ },
28065
+ /**
28066
+ * Set (`active: true`) or clear (`active: false`) a person's exemption.
28067
+ * Clearing keeps the row. Manager-gated.
28068
+ */
28069
+ async setExemption(input) {
28070
+ const { data, status } = await apiFetch(config2, "/endpoint-checks/exemptions", { method: "PUT", body: JSON.stringify(input) });
28071
+ if (status === 403) {
28072
+ throw new Error("Access denied. Only Team Managers can change endpoint exemptions.");
28073
+ }
28074
+ if (status !== 200) {
28075
+ throw new Error(data.error ?? `Failed to set endpoint exemption (${status})`);
28076
+ }
28077
+ return data.exemption;
28078
+ },
28050
28079
  /** Weekly Slack reminder settings (#651). Manager-gated. */
28051
28080
  async getReminderSettings() {
28052
28081
  const { data, status } = await apiFetch(config2, "/endpoint-reminders/settings");
@@ -55349,6 +55378,35 @@ function createEndpointChecksResource2(config2) {
55349
55378
  }
55350
55379
  return data.device;
55351
55380
  },
55381
+ /**
55382
+ * People exempt from the endpoint check (client-managed machines).
55383
+ * Active ones only, unless `includeInactive`. Manager-gated.
55384
+ */
55385
+ async listExemptions(includeInactive = false) {
55386
+ const query = includeInactive ? "?all=true" : "";
55387
+ const { data, status } = await apiFetch2(config2, `/endpoint-checks/exemptions${query}`);
55388
+ if (status === 403) {
55389
+ throw new Error("Access denied. Only Team Managers can list endpoint exemptions.");
55390
+ }
55391
+ if (status !== 200) {
55392
+ throw new Error(data.error ?? `Failed to list endpoint exemptions (${status})`);
55393
+ }
55394
+ return data;
55395
+ },
55396
+ /**
55397
+ * Set (`active: true`) or clear (`active: false`) a person's exemption.
55398
+ * Clearing keeps the row. Manager-gated.
55399
+ */
55400
+ async setExemption(input) {
55401
+ const { data, status } = await apiFetch2(config2, "/endpoint-checks/exemptions", { method: "PUT", body: JSON.stringify(input) });
55402
+ if (status === 403) {
55403
+ throw new Error("Access denied. Only Team Managers can change endpoint exemptions.");
55404
+ }
55405
+ if (status !== 200) {
55406
+ throw new Error(data.error ?? `Failed to set endpoint exemption (${status})`);
55407
+ }
55408
+ return data.exemption;
55409
+ },
55352
55410
  /** Weekly Slack reminder settings (#651). Manager-gated. */
55353
55411
  async getReminderSettings() {
55354
55412
  const { data, status } = await apiFetch2(config2, "/endpoint-reminders/settings");
@@ -56942,6 +57000,26 @@ var setEndpointDeviceStatusInputSchema = external_exports.object(setStatusShape)
56942
57000
  async function setEndpointDeviceStatus(client, input) {
56943
57001
  return safe(() => client.endpointChecks.setDeviceStatus(input));
56944
57002
  }
57003
+ var listExemptionsShape = {
57004
+ includeInactive: external_exports.boolean().optional().describe("Also list cleared exemptions (kept for history). Defaults to active only.")
57005
+ };
57006
+ var listEndpointExemptionsInputSchema = external_exports.object(listExemptionsShape);
57007
+ async function listEndpointExemptions(client, input) {
57008
+ return safe(() => client.endpointChecks.listExemptions(input.includeInactive ?? false));
57009
+ }
57010
+ var setExemptionShape = {
57011
+ email: external_exports.string().min(1).describe("The person's @meltstudio.co email."),
57012
+ active: external_exports.boolean().describe("true sets the exemption; false clears it (the row is kept)."),
57013
+ reason: external_exports.enum(["client_managed"]).optional().describe(
57014
+ "client_managed = works on a machine the client provides and verifies itself. The default."
57015
+ ),
57016
+ clientName: external_exports.string().max(500).optional().describe('The client whose machine it is. Omit to keep the current one; "" clears it.'),
57017
+ note: external_exports.string().max(500).optional().describe('Optional note, e.g. "client runs SOC 2 checks". Omit to keep the current one.')
57018
+ };
57019
+ var setEndpointExemptionInputSchema = external_exports.object(setExemptionShape);
57020
+ async function setEndpointExemption(client, input) {
57021
+ return safe(() => client.endpointChecks.setExemption(input));
57022
+ }
56945
57023
  function registerEndpointCheckTools(server, getClient2) {
56946
57024
  server.registerTool(
56947
57025
  "submit_endpoint_check",
@@ -56988,6 +57066,24 @@ function registerEndpointCheckTools(server, getClient2) {
56988
57066
  },
56989
57067
  withClientArgs(getClient2, setEndpointDeviceStatus)
56990
57068
  );
57069
+ server.registerTool(
57070
+ "list_endpoint_exemptions",
57071
+ {
57072
+ title: "List endpoint check exemptions (manager)",
57073
+ description: "Lists the people exempt from the endpoint check because they work on a client-managed machine the client verifies itself (SOC 2 and similar): email, reason, client name, note, and who set it and when. Active ones only unless includeInactive. Exempt people get no reminders and are left out of the overdue and coverage numbers. Manager-gated.",
57074
+ inputSchema: listExemptionsShape
57075
+ },
57076
+ withClientArgs(getClient2, listEndpointExemptions)
57077
+ );
57078
+ server.registerTool(
57079
+ "set_endpoint_exemption",
57080
+ {
57081
+ title: "Set or clear an endpoint check exemption (manager)",
57082
+ description: "Exempts a person from Melt's endpoint check (active true) because they work on a client-managed machine, or clears the exemption (active false; the row is kept for history). While active they get no weekly reminder DM, are never escalated and don't count as overdue on the dashboard. Any checks they already submitted stay. Pass the client's name when known. Manager-gated.",
57083
+ inputSchema: setExemptionShape
57084
+ },
57085
+ withClientArgs(getClient2, setEndpointExemption)
57086
+ );
56991
57087
  }
56992
57088
  async function getSupportEffort(client, input) {
56993
57089
  return safe(async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "5.28.0",
3
+ "version": "5.29.0",
4
4
  "description": "AI-first development tooling for Melt teams — companion CLI for the org-distributed Claude Code dev skills",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",