@togglhq/cli 1.6.15 → 1.7.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.
package/build/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as CommanderError, t as createProgram } from "./program-Ds6iUlsU.js";
2
+ import { n as CommanderError, t as createProgram } from "./program-BcM7-qb7.js";
3
3
  //#region src/cli.ts
4
4
  try {
5
5
  await createProgram({ enableUpdateNotification: true }).parseAsync(process.argv);
package/build/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as createProgram } from "./program-Ds6iUlsU.js";
1
+ import { t as createProgram } from "./program-BcM7-qb7.js";
2
2
  export { createProgram };
@@ -5626,6 +5626,46 @@ function minValue$1(requirement, message$1) {
5626
5626
  }
5627
5627
  };
5628
5628
  }
5629
+ /**
5630
+ * Checks if a dataset is partially typed.
5631
+ *
5632
+ * @param dataset The dataset to check.
5633
+ * @param paths The paths to check.
5634
+ *
5635
+ * @returns Whether it is partially typed.
5636
+ *
5637
+ * @internal
5638
+ */
5639
+ /* @__NO_SIDE_EFFECTS__ */
5640
+ function _isPartiallyTyped(dataset, paths) {
5641
+ if (dataset.issues) for (const path of paths) for (const issue of dataset.issues) {
5642
+ let typed = false;
5643
+ const bound = Math.min(path.length, issue.path?.length ?? 0);
5644
+ for (let index = 0; index < bound; index++) if (path[index] !== issue.path[index].key && (path[index] !== "$" || issue.path[index].type !== "array")) {
5645
+ typed = true;
5646
+ break;
5647
+ }
5648
+ if (!typed) return false;
5649
+ }
5650
+ return true;
5651
+ }
5652
+ /* @__NO_SIDE_EFFECTS__ */
5653
+ function partialCheck(paths, requirement, message$1) {
5654
+ return {
5655
+ kind: "validation",
5656
+ type: "partial_check",
5657
+ reference: partialCheck,
5658
+ async: false,
5659
+ expects: null,
5660
+ paths,
5661
+ requirement,
5662
+ message: message$1,
5663
+ "~run"(dataset, config$1) {
5664
+ if ((dataset.typed || /* @__PURE__ */ _isPartiallyTyped(dataset, paths)) && !this.requirement(dataset.value)) _addIssue$1(this, "input", dataset, config$1);
5665
+ return dataset;
5666
+ }
5667
+ };
5668
+ }
5629
5669
  /* @__NO_SIDE_EFFECTS__ */
5630
5670
  function regex(requirement, message$1) {
5631
5671
  return {
@@ -5643,6 +5683,24 @@ function regex(requirement, message$1) {
5643
5683
  };
5644
5684
  }
5645
5685
  /**
5686
+ * Creates a to upper case transformation action.
5687
+ *
5688
+ * @returns A to upper case action.
5689
+ */
5690
+ /* @__NO_SIDE_EFFECTS__ */
5691
+ function toUpperCase() {
5692
+ return {
5693
+ kind: "transformation",
5694
+ type: "to_upper_case",
5695
+ reference: toUpperCase,
5696
+ async: false,
5697
+ "~run"(dataset) {
5698
+ dataset.value = dataset.value.toUpperCase();
5699
+ return dataset;
5700
+ }
5701
+ };
5702
+ }
5703
+ /**
5646
5704
  * Creates a custom transformation action.
5647
5705
  *
5648
5706
  * @param operation The transformation operation.
@@ -5664,6 +5722,24 @@ function transform(operation) {
5664
5722
  };
5665
5723
  }
5666
5724
  /**
5725
+ * Creates a trim transformation action.
5726
+ *
5727
+ * @returns A trim action.
5728
+ */
5729
+ /* @__NO_SIDE_EFFECTS__ */
5730
+ function trim() {
5731
+ return {
5732
+ kind: "transformation",
5733
+ type: "trim",
5734
+ reference: trim,
5735
+ async: false,
5736
+ "~run"(dataset) {
5737
+ dataset.value = dataset.value.trim();
5738
+ return dataset;
5739
+ }
5740
+ };
5741
+ }
5742
+ /**
5667
5743
  * Returns the fallback value of the schema.
5668
5744
  *
5669
5745
  * @param schema The schema to get it from.
@@ -5677,6 +5753,44 @@ function getFallback$1(schema, dataset, config$1) {
5677
5753
  return typeof schema.fallback === "function" ? schema.fallback(dataset, config$1) : schema.fallback;
5678
5754
  }
5679
5755
  /**
5756
+ * Forwards the issues of the passed validation action.
5757
+ *
5758
+ * @param action The validation action.
5759
+ * @param path The path to forward the issues to.
5760
+ *
5761
+ * @returns The modified action.
5762
+ */
5763
+ /* @__NO_SIDE_EFFECTS__ */
5764
+ function forward(action, path) {
5765
+ return {
5766
+ ...action,
5767
+ "~run"(dataset, config$1) {
5768
+ const prevIssues = dataset.issues && [...dataset.issues];
5769
+ dataset = action["~run"](dataset, config$1);
5770
+ if (dataset.issues) {
5771
+ for (const issue of dataset.issues) if (!prevIssues?.includes(issue)) {
5772
+ let pathInput = dataset.value;
5773
+ for (const key of path) {
5774
+ const pathValue = pathInput[key];
5775
+ const pathItem = {
5776
+ type: "unknown",
5777
+ origin: "value",
5778
+ input: pathInput,
5779
+ key,
5780
+ value: pathValue
5781
+ };
5782
+ if (issue.path) issue.path.push(pathItem);
5783
+ else issue.path = [pathItem];
5784
+ if (!pathValue) break;
5785
+ pathInput = pathValue;
5786
+ }
5787
+ }
5788
+ }
5789
+ return dataset;
5790
+ }
5791
+ };
5792
+ }
5793
+ /**
5680
5794
  * Returns the default value of the schema.
5681
5795
  *
5682
5796
  * @param schema The schema to get it from.
@@ -6130,6 +6244,87 @@ function record$1(key, value$1, message$1) {
6130
6244
  };
6131
6245
  }
6132
6246
  /* @__NO_SIDE_EFFECTS__ */
6247
+ function strictObject(entries$1, message$1) {
6248
+ return {
6249
+ kind: "schema",
6250
+ type: "strict_object",
6251
+ reference: strictObject,
6252
+ expects: "Object",
6253
+ async: false,
6254
+ entries: entries$1,
6255
+ message: message$1,
6256
+ get "~standard"() {
6257
+ return /* @__PURE__ */ _getStandardProps$1(this);
6258
+ },
6259
+ "~run"(dataset, config$1) {
6260
+ const input = dataset.value;
6261
+ if (input && typeof input === "object") {
6262
+ dataset.typed = true;
6263
+ dataset.value = {};
6264
+ for (const key in this.entries) {
6265
+ const valueSchema = this.entries[key];
6266
+ if (key in input || (valueSchema.type === "exact_optional" || valueSchema.type === "optional" || valueSchema.type === "nullish") && valueSchema.default !== void 0) {
6267
+ const value$1 = key in input ? input[key] : /* @__PURE__ */ getDefault$1(valueSchema);
6268
+ const valueDataset = valueSchema["~run"]({ value: value$1 }, config$1);
6269
+ if (valueDataset.issues) {
6270
+ const pathItem = {
6271
+ type: "object",
6272
+ origin: "value",
6273
+ input,
6274
+ key,
6275
+ value: value$1
6276
+ };
6277
+ for (const issue of valueDataset.issues) {
6278
+ if (issue.path) issue.path.unshift(pathItem);
6279
+ else issue.path = [pathItem];
6280
+ dataset.issues?.push(issue);
6281
+ }
6282
+ if (!dataset.issues) dataset.issues = valueDataset.issues;
6283
+ if (config$1.abortEarly) {
6284
+ dataset.typed = false;
6285
+ break;
6286
+ }
6287
+ }
6288
+ if (!valueDataset.typed) dataset.typed = false;
6289
+ dataset.value[key] = valueDataset.value;
6290
+ } else if (valueSchema.fallback !== void 0) dataset.value[key] = /* @__PURE__ */ getFallback$1(valueSchema);
6291
+ else if (valueSchema.type !== "exact_optional" && valueSchema.type !== "optional" && valueSchema.type !== "nullish") {
6292
+ _addIssue$1(this, "key", dataset, config$1, {
6293
+ input: void 0,
6294
+ expected: `"${key}"`,
6295
+ path: [{
6296
+ type: "object",
6297
+ origin: "key",
6298
+ input,
6299
+ key,
6300
+ value: input[key]
6301
+ }]
6302
+ });
6303
+ if (config$1.abortEarly) break;
6304
+ }
6305
+ }
6306
+ if (!dataset.issues || !config$1.abortEarly) {
6307
+ for (const key in input) if (!(key in this.entries)) {
6308
+ _addIssue$1(this, "key", dataset, config$1, {
6309
+ input: key,
6310
+ expected: "never",
6311
+ path: [{
6312
+ type: "object",
6313
+ origin: "key",
6314
+ input,
6315
+ key,
6316
+ value: input[key]
6317
+ }]
6318
+ });
6319
+ break;
6320
+ }
6321
+ }
6322
+ } else _addIssue$1(this, "type", dataset, config$1);
6323
+ return dataset;
6324
+ }
6325
+ };
6326
+ }
6327
+ /* @__NO_SIDE_EFFECTS__ */
6133
6328
  function string$1(message$1) {
6134
6329
  return {
6135
6330
  kind: "schema",
@@ -12494,7 +12689,7 @@ async function runSkillSetup(options) {
12494
12689
  });
12495
12690
  }
12496
12691
  //#endregion
12497
- //#region ../operations/build/safety-DUCLJgdI.js
12692
+ //#region ../operations/build/validation-v3-RQf0k.js
12498
12693
  const optionalNumber = /* @__PURE__ */ optional$1(/* @__PURE__ */ number$2());
12499
12694
  const perPageField = (max) => /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ number$2(), /* @__PURE__ */ integer(), /* @__PURE__ */ minValue$1(1), /* @__PURE__ */ maxValue$1(max), /* @__PURE__ */ description$1(`Results per page (1-${max})`)));
12500
12695
  const perPageSchema = perPageField(100);
@@ -12502,6 +12697,13 @@ const orgUserPerPageSchema = perPageField(200);
12502
12697
  const DATE_FIELD_RE = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2}))?$/;
12503
12698
  const dateField = (description) => /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ regex(DATE_FIELD_RE, "must be YYYY-MM-DD or RFC3339 datetime (e.g. '2025-01-01' or '2025-01-01T00:00:00Z')"), /* @__PURE__ */ description$1(description));
12504
12699
  const apiDateTimeString = /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoTimestamp());
12700
+ const rateDateSchema = /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1());
12701
+ const rateSchedulePayloadSchema = /* @__PURE__ */ pipe$2(/* @__PURE__ */ strictObject({
12702
+ currency: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ trim(), /* @__PURE__ */ toUpperCase(), /* @__PURE__ */ regex(/^[A-Z]{3}$/, "must be exactly three A-Z letters")),
12703
+ hourly_rate: /* @__PURE__ */ pipe$2(/* @__PURE__ */ number$2(), /* @__PURE__ */ minValue$1(0)),
12704
+ start_date: rateDateSchema,
12705
+ end_date: /* @__PURE__ */ optional$1(rateDateSchema)
12706
+ }), /* @__PURE__ */ forward(/* @__PURE__ */ partialCheck([["start_date"], ["end_date"]], ({ start_date, end_date }) => end_date === void 0 || end_date >= start_date, "must be on or after start_date"), ["end_date"]));
12505
12707
  const tagIdFilterSchema = /* @__PURE__ */ union([/* @__PURE__ */ pipe$2(/* @__PURE__ */ number$2(), /* @__PURE__ */ transform((tagId) => [tagId])), /* @__PURE__ */ pipe$2(/* @__PURE__ */ array$1(/* @__PURE__ */ number$2()), /* @__PURE__ */ minLength$1(1))]);
12506
12708
  const timeBlockListSchema = /* @__PURE__ */ object$2({
12507
12709
  date_from: dateField("Range start — date-only (e.g. '2025-01-01') or RFC3339 datetime. Date-only is expanded to T00:00:00Z."),
@@ -12738,10 +12940,58 @@ const clientOverrides = { "focus.clients.list": {
12738
12940
  }],
12739
12941
  aliases: ["ls"]
12740
12942
  } };
12943
+ const RATE_CONFLICT_CHECK = {
12944
+ safety: "read",
12945
+ destructive: false
12946
+ };
12947
+ const RATE_SCHEDULE_GUIDANCE = "hourly_rate is in the currency's smallest unit, so it depends on the currency: two-decimal currencies like USD/EUR use cents (5000 = 50.00), zero-decimal ones like JPY/KRW use whole units (5000 = 5000), three-decimal ones like KWD/BHD use thousandths. Reads return the same unit. Omit end_date for an open-ended schedule; when set it must be on or after start_date.";
12948
+ const rateOverrides = {
12949
+ "focus.rates.create-project": { mcp: { entityTool: void 0 } },
12950
+ "focus.rates.billable-check-project-billable-rate-conflicts": {
12951
+ ...RATE_CONFLICT_CHECK,
12952
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12953
+ },
12954
+ "focus.rates.billable-check-project-user-billable-rate-conflicts": {
12955
+ ...RATE_CONFLICT_CHECK,
12956
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12957
+ },
12958
+ "focus.rates.billable-check-workspace-billable-rate-conflicts": {
12959
+ ...RATE_CONFLICT_CHECK,
12960
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12961
+ },
12962
+ "focus.rates.billable-check-workspace-user-billable-rate-conflicts": {
12963
+ ...RATE_CONFLICT_CHECK,
12964
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12965
+ },
12966
+ "focus.rates.billable-upsert-project": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12967
+ "focus.rates.billable-upsert-project-user": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12968
+ "focus.rates.billable-upsert-workspace": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12969
+ "focus.rates.billable-upsert-workspace-user": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12970
+ "focus.rates.labor-check-project-labor-cost-conflicts": {
12971
+ ...RATE_CONFLICT_CHECK,
12972
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12973
+ },
12974
+ "focus.rates.labor-check-project-user-labor-cost-conflicts": {
12975
+ ...RATE_CONFLICT_CHECK,
12976
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12977
+ },
12978
+ "focus.rates.labor-check-workspace-labor-cost-conflicts": {
12979
+ ...RATE_CONFLICT_CHECK,
12980
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12981
+ },
12982
+ "focus.rates.labor-check-workspace-user-labor-cost-conflicts": {
12983
+ ...RATE_CONFLICT_CHECK,
12984
+ agentGuidance: RATE_SCHEDULE_GUIDANCE
12985
+ },
12986
+ "focus.rates.labor-upsert-project-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12987
+ "focus.rates.labor-upsert-project-user-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12988
+ "focus.rates.labor-upsert-workspace-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
12989
+ "focus.rates.labor-upsert-workspace-user-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE }
12990
+ };
12741
12991
  const compositeOverrides = {
12742
12992
  "focus.composite.create-project": {
12743
12993
  description: "Create a project with related data such as members, milestones, rates, and billable rates.",
12744
- agentGuidance: "Follow the create action's privacy and billable guidance. Project fields go under payload.project.",
12994
+ agentGuidance: `Follow the create action's privacy and billable guidance. Project fields go under payload.project. Set rates through payload.billable_rates, not the legacy payload.rates (start_at/end_at). For payload.billable_rates: ${RATE_SCHEDULE_GUIDANCE}`,
12745
12995
  cli: {
12746
12996
  group: ["projects"],
12747
12997
  command: "create-advanced",
@@ -13108,6 +13358,18 @@ const projectOverrides = {
13108
13358
  }
13109
13359
  };
13110
13360
  const publicHolidayOverrides = { "focus.public-holidays.get-by-user-ids": { cli: { interactive: "hidden" } } };
13361
+ const readOnlyPostOverrides = Object.fromEntries([
13362
+ "focus.reports.get-flexq-data",
13363
+ "focus.reports.get-flexq-dictionary",
13364
+ "focus.reports.get-workload",
13365
+ "focus.tasks.suggestions-get-project-suggestion-for-atask",
13366
+ "focus.tasks.suggestions-get-project-suggestions-for-multiple-tasks",
13367
+ "focus.time-log-suggestions.get-for-acalendar-event-title",
13368
+ "focus.time-log-suggestions.get-for-multiple-calendar-event-titles"
13369
+ ].map((id) => [id, {
13370
+ safety: "read",
13371
+ destructive: false
13372
+ }]));
13111
13373
  const savedViewOverrides = {
13112
13374
  "focus.saved-views.list": {
13113
13375
  agentGuidance: "Saved views are per-user, so results belong to the authenticated user. Filter by type (inbox, archive, board, timeline, project, project.tasks, project.board, project.timeline, projects) or by partial name match. pinned=true entries are the user's starred views.",
@@ -13881,6 +14143,41 @@ const orgSharedOperations = [
13881
14143
  function operationRequiresExplicitAcknowledgment(operation) {
13882
14144
  return operation.destructive;
13883
14145
  }
14146
+ const MAX_ERROR_LENGTH = 200;
14147
+ const MAX_RECEIVED_LENGTH = 40;
14148
+ function formatIssueMessage(issue) {
14149
+ if (issue.message.includes("but received undefined")) return "required";
14150
+ if (issue.received.length <= MAX_RECEIVED_LENGTH) return issue.message;
14151
+ const index = issue.message.lastIndexOf(issue.received);
14152
+ if (index === -1) return issue.message;
14153
+ const closer = issue.received.startsWith("\"") && issue.received.endsWith("\"") ? "\"" : "";
14154
+ const received = `${issue.received.slice(0, MAX_RECEIVED_LENGTH - 3 - closer.length)}...${closer}`;
14155
+ return issue.message.slice(0, index) + received + issue.message.slice(index + issue.received.length);
14156
+ }
14157
+ function formatValibotError(issues, maxLength = MAX_ERROR_LENGTH) {
14158
+ const messages = issues.map((issue) => {
14159
+ const path = issue.path?.map((segment) => String(segment.key)).join(".") ?? "";
14160
+ const message = formatIssueMessage(issue);
14161
+ return path ? `${path}: ${message}` : message;
14162
+ });
14163
+ if (messages.length === 0) return "";
14164
+ const separators = (messages.length - 1) * 2;
14165
+ if (messages.reduce((sum, message) => sum + message.length, separators) <= maxLength) return messages.join("; ");
14166
+ let included = 0;
14167
+ let length = 0;
14168
+ for (const message of messages) {
14169
+ const next = length + (included === 0 ? 0 : 2) + message.length;
14170
+ if (next + `; (+${messages.length - included - 1} more)`.length > maxLength) break;
14171
+ length = next;
14172
+ included += 1;
14173
+ }
14174
+ if (included === 0) {
14175
+ const suffix = messages.length > 1 ? `; (+${messages.length - 1} more)` : "";
14176
+ if (suffix.length >= maxLength) return messages[0].slice(0, Math.max(maxLength, 1));
14177
+ return messages[0].slice(0, maxLength - suffix.length) + suffix;
14178
+ }
14179
+ return [...messages.slice(0, included), `(+${messages.length - included} more)`].join("; ");
14180
+ }
13884
14181
  //#endregion
13885
14182
  //#region ../focus-queries/dist/audit-log/requests.ts
13886
14183
  async function getAuditLog(httpClient, organization_id, workspace_id, from, to, { entity_type, entity_id, action, user_id, page_size, page_number, export: export_ } = {}, signal) {
@@ -15057,7 +15354,7 @@ const generatedFocusOperations = [
15057
15354
  action: "get-computations",
15058
15355
  title: "Get Computations Capacities",
15059
15356
  description: "Get Computations Capacities.",
15060
- safety: "update",
15357
+ safety: "read",
15061
15358
  destructive: false,
15062
15359
  cli: {
15063
15360
  group: ["capacities"],
@@ -15263,12 +15560,7 @@ const generatedFocusOperations = [
15263
15560
  rrule: /* @__PURE__ */ optional$1(/* @__PURE__ */ string$1()),
15264
15561
  start_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
15265
15562
  }),
15266
- billable_rates: /* @__PURE__ */ optional$1(/* @__PURE__ */ array$1(/* @__PURE__ */ looseObject({
15267
- currency: /* @__PURE__ */ string$1(),
15268
- hourly_rate: /* @__PURE__ */ number$2(),
15269
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
15270
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
15271
- }))),
15563
+ billable_rates: /* @__PURE__ */ optional$1(/* @__PURE__ */ array$1(rateSchedulePayloadSchema)),
15272
15564
  members: /* @__PURE__ */ optional$1(/* @__PURE__ */ looseObject({
15273
15565
  role_id: /* @__PURE__ */ number$2(),
15274
15566
  group_ids: /* @__PURE__ */ optional$1(/* @__PURE__ */ array$1(/* @__PURE__ */ number$2())),
@@ -16691,12 +16983,12 @@ const generatedFocusOperations = [
16691
16983
  action: "complete",
16692
16984
  title: "Complete Projects",
16693
16985
  description: "Complete Projects.",
16694
- safety: "read",
16986
+ safety: "update",
16695
16987
  destructive: false,
16696
16988
  cli: {
16697
16989
  group: ["projects"],
16698
16990
  command: "complete",
16699
- interactive: "available"
16991
+ interactive: "default"
16700
16992
  },
16701
16993
  mcp: { entityTool: "projects" },
16702
16994
  inputSchema: /* @__PURE__ */ looseObject({ project_id: /* @__PURE__ */ number$2() }),
@@ -17355,12 +17647,12 @@ const generatedFocusOperations = [
17355
17647
  action: "pin",
17356
17648
  title: "Pin Projects",
17357
17649
  description: "Pin Projects.",
17358
- safety: "read",
17650
+ safety: "update",
17359
17651
  destructive: false,
17360
17652
  cli: {
17361
17653
  group: ["projects"],
17362
17654
  command: "pin",
17363
- interactive: "available"
17655
+ interactive: "default"
17364
17656
  },
17365
17657
  mcp: { entityTool: "projects" },
17366
17658
  inputSchema: /* @__PURE__ */ looseObject({ project_id: /* @__PURE__ */ number$2() }),
@@ -17382,12 +17674,12 @@ const generatedFocusOperations = [
17382
17674
  action: "remove-project-member",
17383
17675
  title: "Remove Project Member Projects",
17384
17676
  description: "Remove Project Member Projects.",
17385
- safety: "read",
17386
- destructive: false,
17677
+ safety: "delete",
17678
+ destructive: true,
17387
17679
  cli: {
17388
17680
  group: ["projects"],
17389
17681
  command: "remove-project-member",
17390
- interactive: "available"
17682
+ interactive: "default"
17391
17683
  },
17392
17684
  mcp: { entityTool: "projects" },
17393
17685
  inputSchema: /* @__PURE__ */ looseObject({
@@ -17470,12 +17762,12 @@ const generatedFocusOperations = [
17470
17762
  action: "uncomplete",
17471
17763
  title: "Uncomplete Projects",
17472
17764
  description: "Uncomplete Projects.",
17473
- safety: "read",
17765
+ safety: "update",
17474
17766
  destructive: false,
17475
17767
  cli: {
17476
17768
  group: ["projects"],
17477
17769
  command: "uncomplete",
17478
- interactive: "available"
17770
+ interactive: "default"
17479
17771
  },
17480
17772
  mcp: { entityTool: "projects" },
17481
17773
  inputSchema: /* @__PURE__ */ looseObject({ project_id: /* @__PURE__ */ number$2() }),
@@ -17497,12 +17789,12 @@ const generatedFocusOperations = [
17497
17789
  action: "unpin",
17498
17790
  title: "Unpin Projects",
17499
17791
  description: "Unpin Projects.",
17500
- safety: "read",
17501
- destructive: false,
17792
+ safety: "delete",
17793
+ destructive: true,
17502
17794
  cli: {
17503
17795
  group: ["projects"],
17504
17796
  command: "unpin",
17505
- interactive: "available"
17797
+ interactive: "default"
17506
17798
  },
17507
17799
  mcp: { entityTool: "projects" },
17508
17800
  inputSchema: /* @__PURE__ */ looseObject({ project_id: /* @__PURE__ */ number$2() }),
@@ -17668,21 +17960,16 @@ const generatedFocusOperations = [
17668
17960
  action: "billable-check-project-billable-rate-conflicts",
17669
17961
  title: "Billable Check Project Billable Rate Conflicts Rates",
17670
17962
  description: "Billable Check Project Billable Rate Conflicts Rates.",
17671
- safety: "read",
17963
+ safety: "update",
17672
17964
  destructive: false,
17673
17965
  cli: {
17674
17966
  group: ["rates", "billable"],
17675
17967
  command: "check-project-billable-rate-conflicts",
17676
- interactive: "available"
17968
+ interactive: "default"
17677
17969
  },
17678
17970
  mcp: { entityTool: "rates" },
17679
17971
  inputSchema: /* @__PURE__ */ looseObject({
17680
- payload: /* @__PURE__ */ looseObject({
17681
- currency: /* @__PURE__ */ string$1(),
17682
- hourly_rate: /* @__PURE__ */ number$2(),
17683
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
17684
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
17685
- }),
17972
+ payload: rateSchedulePayloadSchema,
17686
17973
  project_id: /* @__PURE__ */ number$2()
17687
17974
  }),
17688
17975
  execute: (input, { client }) => {
@@ -17704,21 +17991,16 @@ const generatedFocusOperations = [
17704
17991
  action: "billable-check-project-user-billable-rate-conflicts",
17705
17992
  title: "Billable Check Project User Billable Rate Conflicts Rates",
17706
17993
  description: "Billable Check Project User Billable Rate Conflicts Rates.",
17707
- safety: "read",
17994
+ safety: "update",
17708
17995
  destructive: false,
17709
17996
  cli: {
17710
17997
  group: ["rates", "billable"],
17711
17998
  command: "check-project-user-billable-rate-conflicts",
17712
- interactive: "available"
17999
+ interactive: "default"
17713
18000
  },
17714
18001
  mcp: { entityTool: "rates" },
17715
18002
  inputSchema: /* @__PURE__ */ looseObject({
17716
- payload: /* @__PURE__ */ looseObject({
17717
- currency: /* @__PURE__ */ string$1(),
17718
- hourly_rate: /* @__PURE__ */ number$2(),
17719
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
17720
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
17721
- }),
18003
+ payload: rateSchedulePayloadSchema,
17722
18004
  project_id: /* @__PURE__ */ number$2(),
17723
18005
  user_id: /* @__PURE__ */ number$2()
17724
18006
  }),
@@ -17742,20 +18024,15 @@ const generatedFocusOperations = [
17742
18024
  action: "billable-check-workspace-billable-rate-conflicts",
17743
18025
  title: "Billable Check Workspace Billable Rate Conflicts Rates",
17744
18026
  description: "Billable Check Workspace Billable Rate Conflicts Rates.",
17745
- safety: "read",
18027
+ safety: "update",
17746
18028
  destructive: false,
17747
18029
  cli: {
17748
18030
  group: ["rates", "billable"],
17749
18031
  command: "check-workspace-billable-rate-conflicts",
17750
- interactive: "available"
18032
+ interactive: "default"
17751
18033
  },
17752
18034
  mcp: { entityTool: "rates" },
17753
- inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
17754
- currency: /* @__PURE__ */ string$1(),
17755
- hourly_rate: /* @__PURE__ */ number$2(),
17756
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
17757
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
17758
- }) }),
18035
+ inputSchema: /* @__PURE__ */ looseObject({ payload: rateSchedulePayloadSchema }),
17759
18036
  execute: (input, { client }) => {
17760
18037
  const data = input;
17761
18038
  return client.runGeneratedRequest("checkWorkspaceBillableRateConflicts", () => callGeneratedRequest(checkWorkspaceBillableRateConflicts, [
@@ -17774,21 +18051,16 @@ const generatedFocusOperations = [
17774
18051
  action: "billable-check-workspace-user-billable-rate-conflicts",
17775
18052
  title: "Billable Check Workspace User Billable Rate Conflicts Rates",
17776
18053
  description: "Billable Check Workspace User Billable Rate Conflicts Rates.",
17777
- safety: "read",
18054
+ safety: "update",
17778
18055
  destructive: false,
17779
18056
  cli: {
17780
18057
  group: ["rates", "billable"],
17781
18058
  command: "check-workspace-user-billable-rate-conflicts",
17782
- interactive: "available"
18059
+ interactive: "default"
17783
18060
  },
17784
18061
  mcp: { entityTool: "rates" },
17785
18062
  inputSchema: /* @__PURE__ */ looseObject({
17786
- payload: /* @__PURE__ */ looseObject({
17787
- currency: /* @__PURE__ */ string$1(),
17788
- hourly_rate: /* @__PURE__ */ number$2(),
17789
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
17790
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
17791
- }),
18063
+ payload: rateSchedulePayloadSchema,
17792
18064
  user_id: /* @__PURE__ */ number$2()
17793
18065
  }),
17794
18066
  execute: (input, { client }) => {
@@ -18183,21 +18455,16 @@ const generatedFocusOperations = [
18183
18455
  action: "billable-upsert-project",
18184
18456
  title: "Billable Upsert Project Rates",
18185
18457
  description: "Billable Upsert Project Rates.",
18186
- safety: "read",
18458
+ safety: "update",
18187
18459
  destructive: false,
18188
18460
  cli: {
18189
18461
  group: ["rates", "billable"],
18190
18462
  command: "upsert-project",
18191
- interactive: "available"
18463
+ interactive: "default"
18192
18464
  },
18193
18465
  mcp: { entityTool: "rates" },
18194
18466
  inputSchema: /* @__PURE__ */ looseObject({
18195
- payload: /* @__PURE__ */ looseObject({
18196
- currency: /* @__PURE__ */ string$1(),
18197
- hourly_rate: /* @__PURE__ */ number$2(),
18198
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18199
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18200
- }),
18467
+ payload: rateSchedulePayloadSchema,
18201
18468
  project_id: /* @__PURE__ */ number$2()
18202
18469
  }),
18203
18470
  execute: (input, { client }) => {
@@ -18219,21 +18486,16 @@ const generatedFocusOperations = [
18219
18486
  action: "billable-upsert-project-user",
18220
18487
  title: "Billable Upsert Project User Rates",
18221
18488
  description: "Billable Upsert Project User Rates.",
18222
- safety: "read",
18489
+ safety: "update",
18223
18490
  destructive: false,
18224
18491
  cli: {
18225
18492
  group: ["rates", "billable"],
18226
18493
  command: "upsert-project-user",
18227
- interactive: "available"
18494
+ interactive: "default"
18228
18495
  },
18229
18496
  mcp: { entityTool: "rates" },
18230
18497
  inputSchema: /* @__PURE__ */ looseObject({
18231
- payload: /* @__PURE__ */ looseObject({
18232
- currency: /* @__PURE__ */ string$1(),
18233
- hourly_rate: /* @__PURE__ */ number$2(),
18234
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18235
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18236
- }),
18498
+ payload: rateSchedulePayloadSchema,
18237
18499
  project_id: /* @__PURE__ */ number$2(),
18238
18500
  user_id: /* @__PURE__ */ number$2()
18239
18501
  }),
@@ -18257,20 +18519,15 @@ const generatedFocusOperations = [
18257
18519
  action: "billable-upsert-workspace",
18258
18520
  title: "Billable Upsert Workspace Rates",
18259
18521
  description: "Billable Upsert Workspace Rates.",
18260
- safety: "read",
18522
+ safety: "update",
18261
18523
  destructive: false,
18262
18524
  cli: {
18263
18525
  group: ["rates", "billable"],
18264
18526
  command: "upsert-workspace",
18265
- interactive: "available"
18527
+ interactive: "default"
18266
18528
  },
18267
18529
  mcp: { entityTool: "rates" },
18268
- inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
18269
- currency: /* @__PURE__ */ string$1(),
18270
- hourly_rate: /* @__PURE__ */ number$2(),
18271
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18272
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18273
- }) }),
18530
+ inputSchema: /* @__PURE__ */ looseObject({ payload: rateSchedulePayloadSchema }),
18274
18531
  execute: (input, { client }) => {
18275
18532
  const data = input;
18276
18533
  return client.runGeneratedRequest("upsertWorkspaceBillableRate", () => callGeneratedRequest(upsertWorkspaceBillableRate, [
@@ -18289,21 +18546,16 @@ const generatedFocusOperations = [
18289
18546
  action: "billable-upsert-workspace-user",
18290
18547
  title: "Billable Upsert Workspace User Rates",
18291
18548
  description: "Billable Upsert Workspace User Rates.",
18292
- safety: "read",
18549
+ safety: "update",
18293
18550
  destructive: false,
18294
18551
  cli: {
18295
18552
  group: ["rates", "billable"],
18296
18553
  command: "upsert-workspace-user",
18297
- interactive: "available"
18554
+ interactive: "default"
18298
18555
  },
18299
18556
  mcp: { entityTool: "rates" },
18300
18557
  inputSchema: /* @__PURE__ */ looseObject({
18301
- payload: /* @__PURE__ */ looseObject({
18302
- currency: /* @__PURE__ */ string$1(),
18303
- hourly_rate: /* @__PURE__ */ number$2(),
18304
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18305
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18306
- }),
18558
+ payload: rateSchedulePayloadSchema,
18307
18559
  user_id: /* @__PURE__ */ number$2()
18308
18560
  }),
18309
18561
  execute: (input, { client }) => {
@@ -18515,21 +18767,16 @@ const generatedFocusOperations = [
18515
18767
  action: "labor-check-project-labor-cost-conflicts",
18516
18768
  title: "Labor Check Project Labor Cost Conflicts Rates",
18517
18769
  description: "Labor Check Project Labor Cost Conflicts Rates.",
18518
- safety: "read",
18770
+ safety: "update",
18519
18771
  destructive: false,
18520
18772
  cli: {
18521
18773
  group: ["rates", "labor"],
18522
18774
  command: "check-project-labor-cost-conflicts",
18523
- interactive: "available"
18775
+ interactive: "default"
18524
18776
  },
18525
18777
  mcp: { entityTool: "rates" },
18526
18778
  inputSchema: /* @__PURE__ */ looseObject({
18527
- payload: /* @__PURE__ */ looseObject({
18528
- currency: /* @__PURE__ */ string$1(),
18529
- hourly_rate: /* @__PURE__ */ number$2(),
18530
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18531
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18532
- }),
18779
+ payload: rateSchedulePayloadSchema,
18533
18780
  project_id: /* @__PURE__ */ number$2()
18534
18781
  }),
18535
18782
  execute: (input, { client }) => {
@@ -18551,21 +18798,16 @@ const generatedFocusOperations = [
18551
18798
  action: "labor-check-project-user-labor-cost-conflicts",
18552
18799
  title: "Labor Check Project User Labor Cost Conflicts Rates",
18553
18800
  description: "Labor Check Project User Labor Cost Conflicts Rates.",
18554
- safety: "read",
18801
+ safety: "update",
18555
18802
  destructive: false,
18556
18803
  cli: {
18557
18804
  group: ["rates", "labor"],
18558
18805
  command: "check-project-user-labor-cost-conflicts",
18559
- interactive: "available"
18806
+ interactive: "default"
18560
18807
  },
18561
18808
  mcp: { entityTool: "rates" },
18562
18809
  inputSchema: /* @__PURE__ */ looseObject({
18563
- payload: /* @__PURE__ */ looseObject({
18564
- currency: /* @__PURE__ */ string$1(),
18565
- hourly_rate: /* @__PURE__ */ number$2(),
18566
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18567
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18568
- }),
18810
+ payload: rateSchedulePayloadSchema,
18569
18811
  project_id: /* @__PURE__ */ number$2(),
18570
18812
  user_id: /* @__PURE__ */ number$2()
18571
18813
  }),
@@ -18589,20 +18831,15 @@ const generatedFocusOperations = [
18589
18831
  action: "labor-check-workspace-labor-cost-conflicts",
18590
18832
  title: "Labor Check Workspace Labor Cost Conflicts Rates",
18591
18833
  description: "Labor Check Workspace Labor Cost Conflicts Rates.",
18592
- safety: "read",
18834
+ safety: "update",
18593
18835
  destructive: false,
18594
18836
  cli: {
18595
18837
  group: ["rates", "labor"],
18596
18838
  command: "check-workspace-labor-cost-conflicts",
18597
- interactive: "available"
18839
+ interactive: "default"
18598
18840
  },
18599
18841
  mcp: { entityTool: "rates" },
18600
- inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
18601
- currency: /* @__PURE__ */ string$1(),
18602
- hourly_rate: /* @__PURE__ */ number$2(),
18603
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18604
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18605
- }) }),
18842
+ inputSchema: /* @__PURE__ */ looseObject({ payload: rateSchedulePayloadSchema }),
18606
18843
  execute: (input, { client }) => {
18607
18844
  const data = input;
18608
18845
  return client.runGeneratedRequest("checkWorkspaceLaborCostConflicts", () => callGeneratedRequest(checkWorkspaceLaborCostConflicts, [
@@ -18621,21 +18858,16 @@ const generatedFocusOperations = [
18621
18858
  action: "labor-check-workspace-user-labor-cost-conflicts",
18622
18859
  title: "Labor Check Workspace User Labor Cost Conflicts Rates",
18623
18860
  description: "Labor Check Workspace User Labor Cost Conflicts Rates.",
18624
- safety: "read",
18861
+ safety: "update",
18625
18862
  destructive: false,
18626
18863
  cli: {
18627
18864
  group: ["rates", "labor"],
18628
18865
  command: "check-workspace-user-labor-cost-conflicts",
18629
- interactive: "available"
18866
+ interactive: "default"
18630
18867
  },
18631
18868
  mcp: { entityTool: "rates" },
18632
18869
  inputSchema: /* @__PURE__ */ looseObject({
18633
- payload: /* @__PURE__ */ looseObject({
18634
- currency: /* @__PURE__ */ string$1(),
18635
- hourly_rate: /* @__PURE__ */ number$2(),
18636
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
18637
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
18638
- }),
18870
+ payload: rateSchedulePayloadSchema,
18639
18871
  user_id: /* @__PURE__ */ number$2()
18640
18872
  }),
18641
18873
  execute: (input, { client }) => {
@@ -19000,21 +19232,16 @@ const generatedFocusOperations = [
19000
19232
  action: "labor-upsert-project-labor-cost-rate",
19001
19233
  title: "Labor Upsert Project Labor Cost Rate Rates",
19002
19234
  description: "Labor Upsert Project Labor Cost Rate Rates.",
19003
- safety: "read",
19235
+ safety: "update",
19004
19236
  destructive: false,
19005
19237
  cli: {
19006
19238
  group: ["rates", "labor"],
19007
19239
  command: "upsert-project-labor-cost-rate",
19008
- interactive: "available"
19240
+ interactive: "default"
19009
19241
  },
19010
19242
  mcp: { entityTool: "rates" },
19011
19243
  inputSchema: /* @__PURE__ */ looseObject({
19012
- payload: /* @__PURE__ */ looseObject({
19013
- currency: /* @__PURE__ */ string$1(),
19014
- hourly_rate: /* @__PURE__ */ number$2(),
19015
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
19016
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
19017
- }),
19244
+ payload: rateSchedulePayloadSchema,
19018
19245
  project_id: /* @__PURE__ */ number$2()
19019
19246
  }),
19020
19247
  execute: (input, { client }) => {
@@ -19036,21 +19263,16 @@ const generatedFocusOperations = [
19036
19263
  action: "labor-upsert-project-user-labor-cost-rate",
19037
19264
  title: "Labor Upsert Project User Labor Cost Rate Rates",
19038
19265
  description: "Labor Upsert Project User Labor Cost Rate Rates.",
19039
- safety: "read",
19266
+ safety: "update",
19040
19267
  destructive: false,
19041
19268
  cli: {
19042
19269
  group: ["rates", "labor"],
19043
19270
  command: "upsert-project-user-labor-cost-rate",
19044
- interactive: "available"
19271
+ interactive: "default"
19045
19272
  },
19046
19273
  mcp: { entityTool: "rates" },
19047
19274
  inputSchema: /* @__PURE__ */ looseObject({
19048
- payload: /* @__PURE__ */ looseObject({
19049
- currency: /* @__PURE__ */ string$1(),
19050
- hourly_rate: /* @__PURE__ */ number$2(),
19051
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
19052
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
19053
- }),
19275
+ payload: rateSchedulePayloadSchema,
19054
19276
  project_id: /* @__PURE__ */ number$2(),
19055
19277
  user_id: /* @__PURE__ */ number$2()
19056
19278
  }),
@@ -19074,20 +19296,15 @@ const generatedFocusOperations = [
19074
19296
  action: "labor-upsert-workspace-labor-cost-rate",
19075
19297
  title: "Labor Upsert Workspace Labor Cost Rate Rates",
19076
19298
  description: "Labor Upsert Workspace Labor Cost Rate Rates.",
19077
- safety: "read",
19299
+ safety: "update",
19078
19300
  destructive: false,
19079
19301
  cli: {
19080
19302
  group: ["rates", "labor"],
19081
19303
  command: "upsert-workspace-labor-cost-rate",
19082
- interactive: "available"
19304
+ interactive: "default"
19083
19305
  },
19084
19306
  mcp: { entityTool: "rates" },
19085
- inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
19086
- currency: /* @__PURE__ */ string$1(),
19087
- hourly_rate: /* @__PURE__ */ number$2(),
19088
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
19089
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
19090
- }) }),
19307
+ inputSchema: /* @__PURE__ */ looseObject({ payload: rateSchedulePayloadSchema }),
19091
19308
  execute: (input, { client }) => {
19092
19309
  const data = input;
19093
19310
  return client.runGeneratedRequest("upsertWorkspaceLaborCostRate", () => callGeneratedRequest(upsertWorkspaceLaborCostRate, [
@@ -19106,21 +19323,16 @@ const generatedFocusOperations = [
19106
19323
  action: "labor-upsert-workspace-user-labor-cost-rate",
19107
19324
  title: "Labor Upsert Workspace User Labor Cost Rate Rates",
19108
19325
  description: "Labor Upsert Workspace User Labor Cost Rate Rates.",
19109
- safety: "read",
19326
+ safety: "update",
19110
19327
  destructive: false,
19111
19328
  cli: {
19112
19329
  group: ["rates", "labor"],
19113
19330
  command: "upsert-workspace-user-labor-cost-rate",
19114
- interactive: "available"
19331
+ interactive: "default"
19115
19332
  },
19116
19333
  mcp: { entityTool: "rates" },
19117
19334
  inputSchema: /* @__PURE__ */ looseObject({
19118
- payload: /* @__PURE__ */ looseObject({
19119
- currency: /* @__PURE__ */ string$1(),
19120
- hourly_rate: /* @__PURE__ */ number$2(),
19121
- start_date: /* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()),
19122
- end_date: /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ string$1(), /* @__PURE__ */ isoDate$1()))
19123
- }),
19335
+ payload: rateSchedulePayloadSchema,
19124
19336
  user_id: /* @__PURE__ */ number$2()
19125
19337
  }),
19126
19338
  execute: (input, { client }) => {
@@ -19142,7 +19354,7 @@ const generatedFocusOperations = [
19142
19354
  action: "get-flexq-data",
19143
19355
  title: "Get Flexq Data Reports",
19144
19356
  description: "Get Flexq Data Reports.",
19145
- safety: "read",
19357
+ safety: "update",
19146
19358
  destructive: false,
19147
19359
  cli: {
19148
19360
  group: ["reports"],
@@ -19211,7 +19423,7 @@ const generatedFocusOperations = [
19211
19423
  action: "get-flexq-dictionary",
19212
19424
  title: "Get Flexq Dictionary Reports",
19213
19425
  description: "Get Flexq Dictionary Reports.",
19214
- safety: "read",
19426
+ safety: "update",
19215
19427
  destructive: false,
19216
19428
  cli: {
19217
19429
  group: ["reports"],
@@ -19237,7 +19449,7 @@ const generatedFocusOperations = [
19237
19449
  action: "get-workload",
19238
19450
  title: "Get Workload Reports",
19239
19451
  description: "Get Workload Reports.",
19240
- safety: "read",
19452
+ safety: "update",
19241
19453
  destructive: false,
19242
19454
  cli: {
19243
19455
  group: ["reports"],
@@ -19712,12 +19924,12 @@ const generatedFocusOperations = [
19712
19924
  action: "upsert-forced-trial",
19713
19925
  title: "Upsert Forced Trial Subscriptions",
19714
19926
  description: "Upsert Forced Trial Subscriptions.",
19715
- safety: "read",
19927
+ safety: "update",
19716
19928
  destructive: false,
19717
19929
  cli: {
19718
19930
  group: ["subscriptions"],
19719
19931
  command: "upsert-forced-trial",
19720
- interactive: "available"
19932
+ interactive: "default"
19721
19933
  },
19722
19934
  mcp: { entityTool: "subscriptions" },
19723
19935
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ plan_workspace_id: /* @__PURE__ */ optional$1(/* @__PURE__ */ number$2()) }) }),
@@ -20235,7 +20447,7 @@ const generatedFocusOperations = [
20235
20447
  action: "constraints-upsert",
20236
20448
  title: "Constraints Upsert Tasks",
20237
20449
  description: "Constraints Upsert Tasks.",
20238
- safety: "read",
20450
+ safety: "update",
20239
20451
  destructive: false,
20240
20452
  cli: {
20241
20453
  group: ["tasks", "constraints"],
@@ -20719,12 +20931,12 @@ const generatedFocusOperations = [
20719
20931
  action: "suggestions-get-project-suggestion-for-atask",
20720
20932
  title: "Suggestions Get Project Suggestion For Atask Tasks",
20721
20933
  description: "Suggestions Get Project Suggestion For Atask Tasks.",
20722
- safety: "read",
20934
+ safety: "update",
20723
20935
  destructive: false,
20724
20936
  cli: {
20725
20937
  group: ["tasks", "suggestions"],
20726
20938
  command: "get-project-suggestion-for-atask",
20727
- interactive: "available"
20939
+ interactive: "default"
20728
20940
  },
20729
20941
  mcp: { entityTool: "tasks" },
20730
20942
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ task_id: /* @__PURE__ */ number$2() }) }),
@@ -20746,12 +20958,12 @@ const generatedFocusOperations = [
20746
20958
  action: "suggestions-get-project-suggestions-for-multiple-tasks",
20747
20959
  title: "Suggestions Get Project Suggestions For Multiple Tasks Tasks",
20748
20960
  description: "Suggestions Get Project Suggestions For Multiple Tasks Tasks.",
20749
- safety: "read",
20961
+ safety: "update",
20750
20962
  destructive: false,
20751
20963
  cli: {
20752
20964
  group: ["tasks", "suggestions"],
20753
20965
  command: "get-project-suggestions-for-multiple-tasks",
20754
- interactive: "available"
20966
+ interactive: "default"
20755
20967
  },
20756
20968
  mcp: { entityTool: "tasks" },
20757
20969
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ task_ids: /* @__PURE__ */ array$1(/* @__PURE__ */ number$2()) }) }),
@@ -21387,7 +21599,7 @@ const generatedFocusOperations = [
21387
21599
  action: "bulk-set-day-duration",
21388
21600
  title: "Bulk Set Day Duration Time Entries",
21389
21601
  description: "Bulk Set Day Duration Time Entries.",
21390
- safety: "read",
21602
+ safety: "update",
21391
21603
  destructive: false,
21392
21604
  cli: {
21393
21605
  group: ["time-entries", "bulk"],
@@ -21436,7 +21648,7 @@ const generatedFocusOperations = [
21436
21648
  action: "constraints-upsert",
21437
21649
  title: "Constraints Upsert Time Entries",
21438
21650
  description: "Constraints Upsert Time Entries.",
21439
- safety: "read",
21651
+ safety: "update",
21440
21652
  destructive: false,
21441
21653
  cli: {
21442
21654
  group: ["time-entries", "constraints"],
@@ -21883,12 +22095,12 @@ const generatedFocusOperations = [
21883
22095
  action: "tracking-start-tracking-from-description",
21884
22096
  title: "Tracking Start Tracking From Description Time Entries",
21885
22097
  description: "Tracking Start Tracking From Description Time Entries.",
21886
- safety: "read",
22098
+ safety: "update",
21887
22099
  destructive: false,
21888
22100
  cli: {
21889
22101
  group: ["time-entries", "tracking"],
21890
22102
  command: "start-tracking-from-description",
21891
- interactive: "available"
22103
+ interactive: "default"
21892
22104
  },
21893
22105
  mcp: { entityTool: "time-entries" },
21894
22106
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
@@ -21989,12 +22201,12 @@ const generatedFocusOperations = [
21989
22201
  action: "get-for-acalendar-event-title",
21990
22202
  title: "Get For Acalendar Event Title Time Log Suggestions",
21991
22203
  description: "Get For Acalendar Event Title Time Log Suggestions.",
21992
- safety: "read",
22204
+ safety: "update",
21993
22205
  destructive: false,
21994
22206
  cli: {
21995
22207
  group: ["time-log-suggestions"],
21996
22208
  command: "get-for-acalendar-event-title",
21997
- interactive: "available"
22209
+ interactive: "default"
21998
22210
  },
21999
22211
  mcp: { entityTool: "time-log-suggestions" },
22000
22212
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ title: /* @__PURE__ */ string$1() }) }),
@@ -22016,12 +22228,12 @@ const generatedFocusOperations = [
22016
22228
  action: "get-for-multiple-calendar-event-titles",
22017
22229
  title: "Get For Multiple Calendar Event Titles Time Log Suggestions",
22018
22230
  description: "Get For Multiple Calendar Event Titles Time Log Suggestions.",
22019
- safety: "read",
22231
+ safety: "update",
22020
22232
  destructive: false,
22021
22233
  cli: {
22022
22234
  group: ["time-log-suggestions"],
22023
22235
  command: "get-for-multiple-calendar-event-titles",
22024
- interactive: "available"
22236
+ interactive: "default"
22025
22237
  },
22026
22238
  mcp: { entityTool: "time-log-suggestions" },
22027
22239
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ items: /* @__PURE__ */ array$1(/* @__PURE__ */ looseObject({
@@ -22391,12 +22603,12 @@ const generatedFocusOperations = [
22391
22603
  action: "approve",
22392
22604
  title: "Approve Timesheets",
22393
22605
  description: "Approve Timesheets.",
22394
- safety: "read",
22606
+ safety: "update",
22395
22607
  destructive: false,
22396
22608
  cli: {
22397
22609
  group: ["timesheets"],
22398
22610
  command: "approve",
22399
- interactive: "available"
22611
+ interactive: "default"
22400
22612
  },
22401
22613
  mcp: { entityTool: "timesheets" },
22402
22614
  inputSchema: /* @__PURE__ */ looseObject({
@@ -22424,12 +22636,12 @@ const generatedFocusOperations = [
22424
22636
  action: "bulk-approve",
22425
22637
  title: "Bulk Approve Timesheets",
22426
22638
  description: "Bulk Approve Timesheets.",
22427
- safety: "read",
22639
+ safety: "update",
22428
22640
  destructive: false,
22429
22641
  cli: {
22430
22642
  group: ["timesheets", "bulk"],
22431
22643
  command: "approve",
22432
- interactive: "available"
22644
+ interactive: "default"
22433
22645
  },
22434
22646
  mcp: { entityTool: "timesheets" },
22435
22647
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({ keys: /* @__PURE__ */ array$1(/* @__PURE__ */ looseObject({
@@ -22455,12 +22667,12 @@ const generatedFocusOperations = [
22455
22667
  action: "bulk-request-changes",
22456
22668
  title: "Bulk Request Changes Timesheets",
22457
22669
  description: "Bulk Request Changes Timesheets.",
22458
- safety: "read",
22670
+ safety: "update",
22459
22671
  destructive: false,
22460
22672
  cli: {
22461
22673
  group: ["timesheets", "bulk"],
22462
22674
  command: "request-changes",
22463
- interactive: "available"
22675
+ interactive: "default"
22464
22676
  },
22465
22677
  mcp: { entityTool: "timesheets" },
22466
22678
  inputSchema: /* @__PURE__ */ looseObject({ payload: /* @__PURE__ */ looseObject({
@@ -22681,12 +22893,12 @@ const generatedFocusOperations = [
22681
22893
  action: "remove-timesheet-flag",
22682
22894
  title: "Remove Timesheet Flag Timesheets",
22683
22895
  description: "Remove Timesheet Flag Timesheets.",
22684
- safety: "read",
22685
- destructive: false,
22896
+ safety: "delete",
22897
+ destructive: true,
22686
22898
  cli: {
22687
22899
  group: ["timesheets"],
22688
22900
  command: "remove-timesheet-flag",
22689
- interactive: "available"
22901
+ interactive: "default"
22690
22902
  },
22691
22903
  mcp: { entityTool: "timesheets" },
22692
22904
  inputSchema: /* @__PURE__ */ looseObject({ flag_id: /* @__PURE__ */ number$2() }),
@@ -22708,12 +22920,12 @@ const generatedFocusOperations = [
22708
22920
  action: "request-changes",
22709
22921
  title: "Request Changes Timesheets",
22710
22922
  description: "Request Changes Timesheets.",
22711
- safety: "read",
22923
+ safety: "update",
22712
22924
  destructive: false,
22713
22925
  cli: {
22714
22926
  group: ["timesheets"],
22715
22927
  command: "request-changes",
22716
- interactive: "available"
22928
+ interactive: "default"
22717
22929
  },
22718
22930
  mcp: { entityTool: "timesheets" },
22719
22931
  inputSchema: /* @__PURE__ */ looseObject({
@@ -22743,12 +22955,12 @@ const generatedFocusOperations = [
22743
22955
  action: "resubmit",
22744
22956
  title: "Resubmit Timesheets",
22745
22957
  description: "Resubmit Timesheets.",
22746
- safety: "read",
22958
+ safety: "update",
22747
22959
  destructive: false,
22748
22960
  cli: {
22749
22961
  group: ["timesheets"],
22750
22962
  command: "resubmit",
22751
- interactive: "available"
22963
+ interactive: "default"
22752
22964
  },
22753
22965
  mcp: { entityTool: "timesheets" },
22754
22966
  inputSchema: /* @__PURE__ */ looseObject({
@@ -22843,12 +23055,12 @@ const generatedFocusOperations = [
22843
23055
  action: "setups-discontinue",
22844
23056
  title: "Setups Discontinue Timesheets",
22845
23057
  description: "Setups Discontinue Timesheets.",
22846
- safety: "read",
23058
+ safety: "update",
22847
23059
  destructive: false,
22848
23060
  cli: {
22849
23061
  group: ["timesheets", "setups"],
22850
23062
  command: "discontinue",
22851
- interactive: "available"
23063
+ interactive: "default"
22852
23064
  },
22853
23065
  mcp: { entityTool: "timesheets" },
22854
23066
  inputSchema: /* @__PURE__ */ looseObject({
@@ -23029,12 +23241,12 @@ const generatedFocusOperations = [
23029
23241
  action: "submit",
23030
23242
  title: "Submit Timesheets",
23031
23243
  description: "Submit Timesheets.",
23032
- safety: "read",
23244
+ safety: "update",
23033
23245
  destructive: false,
23034
23246
  cli: {
23035
23247
  group: ["timesheets"],
23036
23248
  command: "submit",
23037
- interactive: "available"
23249
+ interactive: "default"
23038
23250
  },
23039
23251
  mcp: { entityTool: "timesheets" },
23040
23252
  inputSchema: /* @__PURE__ */ looseObject({
@@ -23062,12 +23274,12 @@ const generatedFocusOperations = [
23062
23274
  action: "withdraw",
23063
23275
  title: "Withdraw Timesheets",
23064
23276
  description: "Withdraw Timesheets.",
23065
- safety: "read",
23277
+ safety: "update",
23066
23278
  destructive: false,
23067
23279
  cli: {
23068
23280
  group: ["timesheets"],
23069
23281
  command: "withdraw",
23070
- interactive: "available"
23282
+ interactive: "default"
23071
23283
  },
23072
23284
  mcp: { entityTool: "timesheets" },
23073
23285
  inputSchema: /* @__PURE__ */ looseObject({
@@ -23595,6 +23807,8 @@ const focusOperationOverrides = {
23595
23807
  ...taskAttachmentOverrides,
23596
23808
  ...projectOverrides,
23597
23809
  ...projectAttachmentOverrides,
23810
+ ...rateOverrides,
23811
+ ...readOnlyPostOverrides,
23598
23812
  ...timeBlockOverrides,
23599
23813
  ...timeEntryOverrides,
23600
23814
  ...statusOverrides,
@@ -24515,22 +24729,11 @@ async function readInput(operation, options) {
24515
24729
  function hasExplicitInput(operation, options) {
24516
24730
  return Boolean(options.dataFile || options.data || inputFromScalarFlags(operation, options));
24517
24731
  }
24518
- function formatIssueMessage(issue) {
24519
- if (issue.type === "object" && issue.message.includes("but received undefined")) return "required";
24520
- return issue.message;
24521
- }
24522
- function formatValibotError(issues) {
24523
- return issues.map((issue) => {
24524
- const path = issue.path?.map((segment) => String(segment.key)).join(".") ?? "";
24525
- const message = formatIssueMessage(issue);
24526
- return path ? `${path}: ${message}` : message;
24527
- }).join("; ");
24528
- }
24529
24732
  async function runValidatedOperation(operation, options, deps) {
24530
24733
  if (operation.hidden) throw new Error(`Operation '${operation.id}' is not available in this build.`);
24531
24734
  const rawInput = deps.rawInput ?? await readInput(operation, options);
24532
24735
  const parseResult = /* @__PURE__ */ safeParse(operation.inputSchema, rawInput);
24533
- if (!parseResult.success) throw new Error(`Invalid input: ${formatValibotError(parseResult.issues)}`);
24736
+ if (!parseResult.success) throw new Error(`Invalid input: ${formatValibotError(parseResult.issues, Number.POSITIVE_INFINITY)}`);
24534
24737
  const input = parseResult.output;
24535
24738
  if (options.dryRun) {
24536
24739
  deps.outputJson({
@@ -25094,4 +25297,4 @@ Common commands:
25094
25297
  //#endregion
25095
25298
  export { CommanderError as n, createProgram as t };
25096
25299
 
25097
- //# sourceMappingURL=program-Ds6iUlsU.js.map
25300
+ //# sourceMappingURL=program-BcM7-qb7.js.map
package/build/program.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as createProgram } from "./program-Ds6iUlsU.js";
1
+ import { t as createProgram } from "./program-BcM7-qb7.js";
2
2
  export { createProgram };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@togglhq/cli",
3
- "version": "1.6.15",
3
+ "version": "1.7.0",
4
4
  "description": "Toggl CLI for Toggl 2.0 API operations.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",