@doist/automations-cli 1.16.0 → 1.17.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.
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  collectSkillStatus,
8
8
  getInstaller,
9
9
  updateAllInstalledSkills
10
- } from "./chunk-UNC4ILAX.js";
10
+ } from "./chunk-DTY2LZDU.js";
11
11
 
12
12
  // ../../node_modules/ajv/dist/compile/codegen/code.js
13
13
  var require_code = __commonJS({
@@ -6899,7 +6899,7 @@ import { fileURLToPath } from "node:url";
6899
6899
  // package.json
6900
6900
  var package_default = {
6901
6901
  name: "@doist/automations-cli",
6902
- version: "1.16.0",
6902
+ version: "1.17.1",
6903
6903
  description: "Command-line client for Todoist Automations",
6904
6904
  type: "module",
6905
6905
  bin: {
@@ -6943,7 +6943,7 @@ var package_default = {
6943
6943
  postinstall: "node scripts/refresh-skills.mjs"
6944
6944
  },
6945
6945
  dependencies: {
6946
- "@doist/cli-core": "1.6.0",
6946
+ "@doist/cli-core": "1.7.0",
6947
6947
  "@napi-rs/keyring": "2.1.0",
6948
6948
  ai: "7.0.77",
6949
6949
  commander: "15.0.0",
@@ -26894,6 +26894,159 @@ var admitUsersResponseSchema = external_exports.object({
26894
26894
  })
26895
26895
  });
26896
26896
 
26897
+ // ../../packages/core/dist/esm/schemas/usage-billing.schema.js
26898
+ var UsageBillingProductSchema = external_exports.literal("automations");
26899
+ var USAGE_BILLING_BLOCK_REASONS = [
26900
+ "insufficient_credit",
26901
+ "temporarily_unavailable"
26902
+ ];
26903
+ var USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS = [
26904
+ ...USAGE_BILLING_BLOCK_REASONS,
26905
+ "no_billing_account"
26906
+ ];
26907
+ var UsageBillingAuthorizationDenialReasonSchema = external_exports.enum(USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS);
26908
+ var UsageBillingBlockReasonSchema = external_exports.enum(USAGE_BILLING_BLOCK_REASONS);
26909
+ var UsageBillingAccountSchema = external_exports.object({
26910
+ id: external_exports.string().regex(/^[1-9]\d*$/),
26911
+ type: external_exports.literal("user")
26912
+ });
26913
+ var RESERVATION_ID_MAX_LENGTH = 100;
26914
+ var EXTERNAL_EVENT_ID_MAX_LENGTH = 100;
26915
+ var CATEGORY_MAX_LENGTH = 64;
26916
+ var AuthorizeUsageRequestSchema = external_exports.object({
26917
+ product: UsageBillingProductSchema,
26918
+ account: UsageBillingAccountSchema,
26919
+ reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
26920
+ category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH)
26921
+ });
26922
+ var UsageBillingUnitsSchema = external_exports.number().int().nonnegative();
26923
+ var UsageBillingBalanceSchema = external_exports.number().int();
26924
+ var RecordUsageRefsSchema = external_exports.record(external_exports.string().max(40), external_exports.string().max(500)).refine((refs) => Object.keys(refs).length <= 50);
26925
+ var AuthorizeUsageResponseSchema = external_exports.discriminatedUnion("decision", [
26926
+ external_exports.object({
26927
+ decision: external_exports.literal("allowed"),
26928
+ reservation_id: external_exports.string().min(1),
26929
+ available_units: UsageBillingBalanceSchema
26930
+ }),
26931
+ external_exports.object({
26932
+ decision: external_exports.literal("denied"),
26933
+ reason: UsageBillingAuthorizationDenialReasonSchema,
26934
+ available_units: UsageBillingBalanceSchema
26935
+ })
26936
+ ]);
26937
+ var RecordUsageRequestSchema = external_exports.object({
26938
+ product: UsageBillingProductSchema,
26939
+ account: UsageBillingAccountSchema,
26940
+ reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
26941
+ external_event_id: external_exports.string().min(1).max(EXTERNAL_EVENT_ID_MAX_LENGTH).refine((value) => !value.startsWith("reservation:")),
26942
+ category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH),
26943
+ status: external_exports.enum(["success", "failed", "cancelled", "timed_out", "partial"]),
26944
+ incurred_cost: external_exports.number().int().nonnegative(),
26945
+ refs: RecordUsageRefsSchema.optional(),
26946
+ description: external_exports.string().min(1).max(255)
26947
+ });
26948
+ var RecordUsageResponseSchema = external_exports.object({
26949
+ recorded: external_exports.boolean(),
26950
+ charged_units: UsageBillingUnitsSchema,
26951
+ available_units: UsageBillingBalanceSchema
26952
+ });
26953
+ var TOP_UP_USD_MIN_AMOUNT = 500;
26954
+ var TopUpCurrencySchema = external_exports.preprocess((value) => typeof value === "string" ? value.toLowerCase() : value, external_exports.literal("usd"));
26955
+ var StartTopUpRequestSchema = external_exports.object({
26956
+ amount: external_exports.number().int().min(TOP_UP_USD_MIN_AMOUNT),
26957
+ // The public OpenAPI example uses lowercase `usd`; the backend also
26958
+ // normalizes caller casing before checking the currently supported currency.
26959
+ currency: TopUpCurrencySchema,
26960
+ return_url: external_exports.url()
26961
+ });
26962
+ var StartTopUpResponseSchema = external_exports.object({
26963
+ session_id: external_exports.string().min(1),
26964
+ checkout_url: external_exports.url()
26965
+ });
26966
+ var BillingPortalUrlRequestSchema = external_exports.object({
26967
+ return_url: external_exports.url()
26968
+ });
26969
+ var BillingPortalUrlResponseSchema = external_exports.object({
26970
+ billing_portal_url: external_exports.url()
26971
+ });
26972
+ var ReadStateResponseSchema = external_exports.object({
26973
+ available_units: UsageBillingBalanceSchema,
26974
+ available_amount: UsageBillingBalanceSchema,
26975
+ currency: external_exports.string(),
26976
+ usage_allowed: external_exports.boolean(),
26977
+ low_balance: external_exports.boolean(),
26978
+ depleted: external_exports.boolean(),
26979
+ /**
26980
+ * Additive hold-free snapshot. These fields remain optional until every
26981
+ * Todoist producer emits them, and balances may be overdrawn after a
26982
+ * settlement.
26983
+ */
26984
+ settled_units: UsageBillingBalanceSchema.optional(),
26985
+ settled_amount: UsageBillingBalanceSchema.optional(),
26986
+ is_settled_low_balance: external_exports.boolean().optional(),
26987
+ usage_block_reason: UsageBillingBlockReasonSchema.nullable().optional()
26988
+ });
26989
+ var UsageBillingAmountSchema = UsageBillingUnitsSchema.nullable();
26990
+ var UsageBillingEntrySchema = external_exports.object({
26991
+ id: external_exports.number().int().positive(),
26992
+ type: external_exports.string().min(1),
26993
+ created_at: external_exports.iso.datetime(),
26994
+ category: external_exports.string().min(1).optional(),
26995
+ status: external_exports.string().min(1).optional(),
26996
+ charged_units: UsageBillingAmountSchema,
26997
+ /** `charged_units` in integer microdollars. `null` exactly when it is. */
26998
+ charged_amount: UsageBillingAmountSchema,
26999
+ credited_units: UsageBillingAmountSchema,
27000
+ /** `credited_units` in integer microdollars. `null` exactly when it is. */
27001
+ credited_amount: UsageBillingAmountSchema,
27002
+ refs: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
27003
+ description: external_exports.string().optional()
27004
+ }).refine((entry) => entry.charged_units === null === (entry.charged_amount === null) && entry.credited_units === null === (entry.credited_amount === null), { message: "Each units field and its amount must be null together" });
27005
+ var USAGE_BILLING_ENTRY_TYPES = [
27006
+ "usage_settled",
27007
+ "top_up",
27008
+ "adjustment",
27009
+ "void",
27010
+ "expiry",
27011
+ "chargeback"
27012
+ ];
27013
+ var UsageBillingEntryTypeSchema = external_exports.enum(USAGE_BILLING_ENTRY_TYPES);
27014
+ var ReadTransactionsResponseSchema = external_exports.object({
27015
+ /**
27016
+ * On the page rather than on each entry: an account pins one price for its
27017
+ * whole life, so no two entries can differ.
27018
+ */
27019
+ currency: external_exports.string(),
27020
+ entries: external_exports.array(UsageBillingEntrySchema),
27021
+ has_more: external_exports.boolean(),
27022
+ /** Absent on the last page. */
27023
+ next_cursor: external_exports.string().min(1).optional()
27024
+ });
27025
+ var ReadUsageSummaryRequestSchema = external_exports.object({
27026
+ /** Omit to total every category. */
27027
+ category: external_exports.string().min(1).optional(),
27028
+ /** Start of the window, inclusive. Omit to start at the account's first event. */
27029
+ since: external_exports.iso.datetime().optional(),
27030
+ /** End of the window, exclusive. Omit to run to now. */
27031
+ until: external_exports.iso.datetime().optional()
27032
+ });
27033
+ var ReadUsageSummaryResponseSchema = external_exports.object({
27034
+ currency: external_exports.string(),
27035
+ usage_count: UsageBillingUnitsSchema,
27036
+ charged_units: UsageBillingUnitsSchema,
27037
+ /** `charged_units` in integer microdollars. `0` on an account with no usage. */
27038
+ charged_amount: UsageBillingUnitsSchema
27039
+ });
27040
+ var GrantWelcomeCreditRequestSchema = external_exports.object({
27041
+ product: UsageBillingProductSchema,
27042
+ account: UsageBillingAccountSchema,
27043
+ operator: external_exports.email().max(254)
27044
+ });
27045
+ var GrantWelcomeCreditResponseSchema = external_exports.object({
27046
+ status: external_exports.enum(["granted", "already_granted"]),
27047
+ grant_id: external_exports.string().min(1)
27048
+ });
27049
+
26897
27050
  // ../../packages/core/dist/esm/types/failure-category.types.js
26898
27051
  var FAILURE_CATEGORIES = [
26899
27052
  "mcp_upstream_unavailable",
@@ -26918,7 +27071,7 @@ var FAILURE_CATEGORIES = [
26918
27071
  "billing_unavailable",
26919
27072
  "unknown"
26920
27073
  ];
26921
- var SKIP_CATEGORIES = ["insufficient_credit"];
27074
+ var SKIP_CATEGORIES = USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS;
26922
27075
 
26923
27076
  // ../../packages/core/dist/esm/schemas/shared.schema.js
26924
27077
  var RolloutCompatibleNullableStringSchema = external_exports.string().nullish().transform((value) => value ?? null);
@@ -29090,7 +29243,9 @@ var chatUsagePreviewSchema = external_exports.object({
29090
29243
  var chatStreamRequestErrorResponseSchema = external_exports.object({
29091
29244
  message: external_exports.string(),
29092
29245
  statusCode: external_exports.number().int(),
29093
- code: external_exports.enum(USAGE_BILLING_DENIAL_CODES).optional().catch(void 0)
29246
+ code: external_exports.enum(USAGE_BILLING_DENIAL_CODES).optional().catch(void 0),
29247
+ /** Present only when the server establishes whether work started. */
29248
+ execution_started: external_exports.boolean().optional()
29094
29249
  });
29095
29250
  var CHAT_CONVERSATION_STATUSES = ["active", "archived", "all"];
29096
29251
  var chatConversationStatusSchema = external_exports.enum(CHAT_CONVERSATION_STATUSES);
@@ -29825,140 +29980,6 @@ var subscriptionResponseSchema = external_exports.object({
29825
29980
  updatedAt: external_exports.string()
29826
29981
  });
29827
29982
 
29828
- // ../../packages/core/dist/esm/schemas/usage-billing.schema.js
29829
- var UsageBillingProductSchema = external_exports.literal("automations");
29830
- var UsageBillingAccountSchema = external_exports.object({
29831
- id: external_exports.string().regex(/^[1-9]\d*$/),
29832
- type: external_exports.literal("user")
29833
- });
29834
- var RESERVATION_ID_MAX_LENGTH = 100;
29835
- var EXTERNAL_EVENT_ID_MAX_LENGTH = 100;
29836
- var CATEGORY_MAX_LENGTH = 64;
29837
- var AuthorizeUsageRequestSchema = external_exports.object({
29838
- product: UsageBillingProductSchema,
29839
- account: UsageBillingAccountSchema,
29840
- reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
29841
- category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH)
29842
- });
29843
- var UsageBillingUnitsSchema = external_exports.number().int().nonnegative();
29844
- var UsageBillingBalanceSchema = external_exports.number().int();
29845
- var RecordUsageRefsSchema = external_exports.record(external_exports.string().max(40), external_exports.string().max(500)).refine((refs) => Object.keys(refs).length <= 50);
29846
- var AuthorizeUsageResponseSchema = external_exports.discriminatedUnion("decision", [
29847
- external_exports.object({
29848
- decision: external_exports.literal("allowed"),
29849
- reservation_id: external_exports.string().min(1),
29850
- available_units: UsageBillingBalanceSchema
29851
- }),
29852
- external_exports.object({
29853
- decision: external_exports.literal("denied"),
29854
- reason: external_exports.enum(["insufficient_credit", "no_billing_account"]),
29855
- available_units: UsageBillingBalanceSchema
29856
- })
29857
- ]);
29858
- var RecordUsageRequestSchema = external_exports.object({
29859
- product: UsageBillingProductSchema,
29860
- account: UsageBillingAccountSchema,
29861
- reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
29862
- external_event_id: external_exports.string().min(1).max(EXTERNAL_EVENT_ID_MAX_LENGTH).refine((value) => !value.startsWith("reservation:")),
29863
- category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH),
29864
- status: external_exports.enum(["success", "failed", "cancelled", "timed_out", "partial"]),
29865
- incurred_cost: external_exports.number().int().nonnegative(),
29866
- refs: RecordUsageRefsSchema.optional(),
29867
- description: external_exports.string().min(1).max(255)
29868
- });
29869
- var RecordUsageResponseSchema = external_exports.object({
29870
- recorded: external_exports.boolean(),
29871
- charged_units: UsageBillingUnitsSchema,
29872
- available_units: UsageBillingBalanceSchema
29873
- });
29874
- var TOP_UP_USD_MIN_AMOUNT = 500;
29875
- var TopUpCurrencySchema = external_exports.preprocess((value) => typeof value === "string" ? value.toLowerCase() : value, external_exports.literal("usd"));
29876
- var StartTopUpRequestSchema = external_exports.object({
29877
- amount: external_exports.number().int().min(TOP_UP_USD_MIN_AMOUNT),
29878
- // The public OpenAPI example uses lowercase `usd`; the backend also
29879
- // normalizes caller casing before checking the currently supported currency.
29880
- currency: TopUpCurrencySchema,
29881
- return_url: external_exports.url()
29882
- });
29883
- var StartTopUpResponseSchema = external_exports.object({
29884
- session_id: external_exports.string().min(1),
29885
- checkout_url: external_exports.url()
29886
- });
29887
- var BillingPortalUrlRequestSchema = external_exports.object({
29888
- return_url: external_exports.url()
29889
- });
29890
- var BillingPortalUrlResponseSchema = external_exports.object({
29891
- billing_portal_url: external_exports.url()
29892
- });
29893
- var ReadStateResponseSchema = external_exports.object({
29894
- available_units: UsageBillingBalanceSchema,
29895
- available_amount: UsageBillingBalanceSchema,
29896
- currency: external_exports.string(),
29897
- usage_allowed: external_exports.boolean(),
29898
- low_balance: external_exports.boolean(),
29899
- depleted: external_exports.boolean()
29900
- });
29901
- var UsageBillingAmountSchema = UsageBillingUnitsSchema.nullable();
29902
- var UsageBillingEntrySchema = external_exports.object({
29903
- id: external_exports.number().int().positive(),
29904
- type: external_exports.string().min(1),
29905
- created_at: external_exports.iso.datetime(),
29906
- category: external_exports.string().min(1).optional(),
29907
- status: external_exports.string().min(1).optional(),
29908
- charged_units: UsageBillingAmountSchema,
29909
- /** `charged_units` in integer microdollars. `null` exactly when it is. */
29910
- charged_amount: UsageBillingAmountSchema,
29911
- credited_units: UsageBillingAmountSchema,
29912
- /** `credited_units` in integer microdollars. `null` exactly when it is. */
29913
- credited_amount: UsageBillingAmountSchema,
29914
- refs: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
29915
- description: external_exports.string().optional()
29916
- }).refine((entry) => entry.charged_units === null === (entry.charged_amount === null) && entry.credited_units === null === (entry.credited_amount === null), { message: "Each units field and its amount must be null together" });
29917
- var USAGE_BILLING_ENTRY_TYPES = [
29918
- "usage_settled",
29919
- "top_up",
29920
- "adjustment",
29921
- "void",
29922
- "expiry",
29923
- "chargeback"
29924
- ];
29925
- var UsageBillingEntryTypeSchema = external_exports.enum(USAGE_BILLING_ENTRY_TYPES);
29926
- var ReadTransactionsResponseSchema = external_exports.object({
29927
- /**
29928
- * On the page rather than on each entry: an account pins one price for its
29929
- * whole life, so no two entries can differ.
29930
- */
29931
- currency: external_exports.string(),
29932
- entries: external_exports.array(UsageBillingEntrySchema),
29933
- has_more: external_exports.boolean(),
29934
- /** Absent on the last page. */
29935
- next_cursor: external_exports.string().min(1).optional()
29936
- });
29937
- var ReadUsageSummaryRequestSchema = external_exports.object({
29938
- /** Omit to total every category. */
29939
- category: external_exports.string().min(1).optional(),
29940
- /** Start of the window, inclusive. Omit to start at the account's first event. */
29941
- since: external_exports.iso.datetime().optional(),
29942
- /** End of the window, exclusive. Omit to run to now. */
29943
- until: external_exports.iso.datetime().optional()
29944
- });
29945
- var ReadUsageSummaryResponseSchema = external_exports.object({
29946
- currency: external_exports.string(),
29947
- usage_count: UsageBillingUnitsSchema,
29948
- charged_units: UsageBillingUnitsSchema,
29949
- /** `charged_units` in integer microdollars. `0` on an account with no usage. */
29950
- charged_amount: UsageBillingUnitsSchema
29951
- });
29952
- var GrantWelcomeCreditRequestSchema = external_exports.object({
29953
- product: UsageBillingProductSchema,
29954
- account: UsageBillingAccountSchema,
29955
- operator: external_exports.email().max(254)
29956
- });
29957
- var GrantWelcomeCreditResponseSchema = external_exports.object({
29958
- status: external_exports.enum(["granted", "already_granted"]),
29959
- grant_id: external_exports.string().min(1)
29960
- });
29961
-
29962
29983
  // ../../packages/core/dist/esm/schemas/user-settings.schema.js
29963
29984
  var UserAccessStateSchema = external_exports.enum(["allowed", "waiting"]);
29964
29985
  var UserOnboardingStateSchema = external_exports.object({
@@ -31055,6 +31076,14 @@ var WorkspaceAutomationDraftsClient = class extends BaseClient {
31055
31076
  });
31056
31077
  return automationDraftWithValidationSchema.parse(data);
31057
31078
  }
31079
+ /** Deletes the draft. Only its owner can; the API answers 404 otherwise. */
31080
+ async delete(workspaceId, draftId, options) {
31081
+ await this.request({
31082
+ method: "DELETE",
31083
+ path: workspaceAutomationDraftsEndpoints.detail(IdSchema.parse(workspaceId), IdSchema.parse(draftId)),
31084
+ options
31085
+ });
31086
+ }
31058
31087
  };
31059
31088
 
31060
31089
  // ../../packages/sdk/dist/esm/clients/workspace-chat/endpoints.js
@@ -31173,6 +31202,17 @@ var WorkspaceAutomationsClient = class extends BaseClient {
31173
31202
  options
31174
31203
  });
31175
31204
  }
31205
+ /**
31206
+ * Deletes the automation. Workspace admins may delete another member's
31207
+ * team-visible automation; a private one is only reachable by its creator.
31208
+ */
31209
+ async delete(workspaceId, id, options) {
31210
+ await this.request({
31211
+ method: "DELETE",
31212
+ path: workspaceAutomationsEndpoints.detail(IdSchema.parse(workspaceId), IdSchema.parse(id)),
31213
+ options
31214
+ });
31215
+ }
31176
31216
  };
31177
31217
 
31178
31218
  // ../../packages/sdk/dist/esm/clients/workspaces/endpoints.js
@@ -33854,6 +33894,15 @@ function summarizeAutomationChange(result) {
33854
33894
  function formatAutomationTrigger(result) {
33855
33895
  return `Triggered automation ${result.automationId}.`;
33856
33896
  }
33897
+ function formatAutomationDelete(result) {
33898
+ if (result.action === "delete_preview") {
33899
+ return [
33900
+ `Automation ${result.automationId} ("${result.name}") was not deleted.`,
33901
+ "Use --yes to confirm."
33902
+ ].join("\n");
33903
+ }
33904
+ return `Deleted automation ${result.automationId}.`;
33905
+ }
33857
33906
  function capitalize(value) {
33858
33907
  return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;
33859
33908
  }
@@ -33933,6 +33982,34 @@ function registerAutomationCommand(program) {
33933
33982
  { spinner: "Triggering automation..." }
33934
33983
  );
33935
33984
  });
33985
+ addWorkspaceScopeOptions(
33986
+ automation.command("delete").description("Delete an automation after previewing which one it is").argument("<automation-id>", "Automation ID").option("--yes", "Confirm deletion")
33987
+ ).action(async (automationId, options, command) => {
33988
+ await runApiCommand(
33989
+ command,
33990
+ async ({ api, signal }) => {
33991
+ const workspaceId = await resolveWorkspaceScope(options);
33992
+ if (options.yes !== true) {
33993
+ const automation2 = workspaceId === null ? await api.automations.get(automationId, { signal }) : await api.workspaceAutomations.get(workspaceId, automationId, {
33994
+ signal
33995
+ });
33996
+ return {
33997
+ action: "delete_preview",
33998
+ automationId,
33999
+ name: getResourceName(automation2.manifest)
34000
+ };
34001
+ }
34002
+ if (workspaceId === null) {
34003
+ await api.automations.delete(automationId, { signal });
34004
+ } else {
34005
+ await api.workspaceAutomations.delete(workspaceId, automationId, { signal });
34006
+ }
34007
+ return { action: "deleted", automationId };
34008
+ },
34009
+ { human: formatAutomationDelete },
34010
+ { spinner: "Deleting automation..." }
34011
+ );
34012
+ });
33936
34013
  addWorkspaceScopeOptions(
33937
34014
  automation.command("update").description("Replace an automation name and description").argument("<automation-id>", "Automation ID").option("--name <name>", "New automation name (required)").option("--description <description>", "New automation description (required)")
33938
34015
  ).action(
@@ -36000,9 +36077,21 @@ function registerConnectorCommand(program) {
36000
36077
  registerConnectorMutationCommands(connector);
36001
36078
  }
36002
36079
 
36080
+ // src/commands/draft/format.ts
36081
+ function formatDraftDelete(result) {
36082
+ if (result.action === "delete_preview") {
36083
+ return [
36084
+ `Draft ${result.draftId} ("${result.name}") was not deleted.`,
36085
+ "Deleting the last draft in a conversation archives that conversation.",
36086
+ "Use --yes to confirm."
36087
+ ].join("\n");
36088
+ }
36089
+ return `Deleted draft ${result.draftId}.`;
36090
+ }
36091
+
36003
36092
  // src/commands/draft/index.ts
36004
36093
  function registerDraftCommand(program) {
36005
- const draft = program.command("draft").description("Inspect automation drafts");
36094
+ const draft = program.command("draft").description("Inspect and delete automation drafts");
36006
36095
  addWorkspaceScopeOptions(
36007
36096
  addCursorPaginationOptions(
36008
36097
  draft.command("list").description("List drafts").option(
@@ -36046,6 +36135,34 @@ function registerDraftCommand(program) {
36046
36135
  { spinner: "Loading draft..." }
36047
36136
  );
36048
36137
  });
36138
+ addWorkspaceScopeOptions(
36139
+ draft.command("delete").description("Delete a draft after previewing which one it is").argument("<draft-id>", "Draft ID").option("--yes", "Confirm deletion")
36140
+ ).action(async (draftId, options, command) => {
36141
+ await runApiCommand(
36142
+ command,
36143
+ async ({ api, signal }) => {
36144
+ const workspaceId = await resolveWorkspaceScope(options);
36145
+ if (options.yes !== true) {
36146
+ const { draft: draft2 } = workspaceId === null ? await api.automationDrafts.get(draftId, { signal }) : await api.workspaceAutomationDrafts.get(workspaceId, draftId, {
36147
+ signal
36148
+ });
36149
+ return {
36150
+ action: "delete_preview",
36151
+ draftId,
36152
+ name: getResourceName(draft2.partialManifest)
36153
+ };
36154
+ }
36155
+ if (workspaceId === null) {
36156
+ await api.automationDrafts.delete(draftId, { signal });
36157
+ } else {
36158
+ await api.workspaceAutomationDrafts.delete(workspaceId, draftId, { signal });
36159
+ }
36160
+ return { action: "deleted", draftId };
36161
+ },
36162
+ { human: formatDraftDelete },
36163
+ { spinner: "Deleting draft..." }
36164
+ );
36165
+ });
36049
36166
  }
36050
36167
  function streamDraftList(options, fetchPage) {
36051
36168
  if (options.full) return streamCursorNdjsonItems(options, fetchPage);