@doist/automations-cli 1.17.0 → 1.18.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/dist/index.js +460 -160
- package/dist/index.js.map +4 -4
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -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.
|
|
6902
|
+
version: "1.18.0",
|
|
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.
|
|
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",
|
|
@@ -6953,13 +6953,13 @@ var package_default = {
|
|
|
6953
6953
|
devDependencies: {
|
|
6954
6954
|
"@doist/automations-core": "*",
|
|
6955
6955
|
"@doist/automations-sdk": "*",
|
|
6956
|
-
"@types/node": "24.
|
|
6956
|
+
"@types/node": "24.19.1",
|
|
6957
6957
|
"conventional-changelog-conventionalcommits": "9.3.1",
|
|
6958
6958
|
esbuild: "0.28.2",
|
|
6959
6959
|
"semantic-release": "25.0.9",
|
|
6960
6960
|
"semantic-release-monorepo": "8.0.2",
|
|
6961
6961
|
typescript: "6.0.3",
|
|
6962
|
-
vitest: "
|
|
6962
|
+
vitest: "5.0.3"
|
|
6963
6963
|
},
|
|
6964
6964
|
engines: {
|
|
6965
6965
|
node: ">=24"
|
|
@@ -7037,6 +7037,10 @@ var API_SCOPES = {
|
|
|
7037
7037
|
};
|
|
7038
7038
|
var API_SCOPE_CODES = Object.keys(API_SCOPES);
|
|
7039
7039
|
|
|
7040
|
+
// ../../packages/core/dist/esm/constants/cli-client.constants.js
|
|
7041
|
+
var AUTOMATIONS_CLI_CLIENT_NAME = "Todoist Automations CLI";
|
|
7042
|
+
var AUTOMATIONS_CLI_LOGO_URL = "https://todoist.b-cdn.net/agentist-icons/service_automations-cli_color_192px.png";
|
|
7043
|
+
|
|
7040
7044
|
// ../../packages/core/dist/esm/constants/connection.constants.js
|
|
7041
7045
|
var CONNECTION_STATUSES = ["pending", "authorized", "expired", "error"];
|
|
7042
7046
|
var CONNECTION_TYPES = ["mcp", "trigger", "api"];
|
|
@@ -7124,71 +7128,98 @@ var MODEL_CATALOG = {
|
|
|
7124
7128
|
"gemini-2.5-flash-lite": {
|
|
7125
7129
|
provider: "gemini",
|
|
7126
7130
|
family: "2.5",
|
|
7127
|
-
providerModelId: "gemini-2.5-flash-lite"
|
|
7131
|
+
providerModelId: "gemini-2.5-flash-lite",
|
|
7132
|
+
manifestSelectable: true
|
|
7128
7133
|
},
|
|
7129
7134
|
"gemini-2.5-flash": {
|
|
7130
7135
|
provider: "gemini",
|
|
7131
7136
|
family: "2.5",
|
|
7132
|
-
providerModelId: "gemini-2.5-flash"
|
|
7137
|
+
providerModelId: "gemini-2.5-flash",
|
|
7138
|
+
manifestSelectable: true
|
|
7133
7139
|
},
|
|
7134
7140
|
"gemini-3.1-pro": {
|
|
7135
7141
|
provider: "gemini",
|
|
7136
7142
|
family: "3",
|
|
7137
|
-
providerModelId: "gemini-3.1-pro-preview"
|
|
7143
|
+
providerModelId: "gemini-3.1-pro-preview",
|
|
7144
|
+
manifestSelectable: true
|
|
7138
7145
|
},
|
|
7139
7146
|
"gemini-3.8-flash": {
|
|
7140
7147
|
provider: "gemini",
|
|
7141
7148
|
family: "3",
|
|
7142
|
-
providerModelId: "gemini-3.8-flash"
|
|
7149
|
+
providerModelId: "gemini-3.8-flash",
|
|
7150
|
+
manifestSelectable: true
|
|
7143
7151
|
},
|
|
7144
7152
|
"claude-opus-4-6": {
|
|
7145
7153
|
provider: "anthropic",
|
|
7146
7154
|
family: "4.6",
|
|
7147
|
-
providerModelId: "claude-opus-4-6"
|
|
7155
|
+
providerModelId: "claude-opus-4-6",
|
|
7156
|
+
manifestSelectable: true
|
|
7148
7157
|
},
|
|
7149
7158
|
"claude-sonnet-5": {
|
|
7150
7159
|
provider: "anthropic",
|
|
7151
7160
|
family: "5",
|
|
7152
|
-
providerModelId: "claude-sonnet-5"
|
|
7161
|
+
providerModelId: "claude-sonnet-5",
|
|
7162
|
+
manifestSelectable: true
|
|
7163
|
+
},
|
|
7164
|
+
"claude-sonnet-5-5": {
|
|
7165
|
+
provider: "anthropic",
|
|
7166
|
+
family: "5",
|
|
7167
|
+
providerModelId: "claude-sonnet-5-5",
|
|
7168
|
+
manifestSelectable: false
|
|
7169
|
+
},
|
|
7170
|
+
"claude-haiku-5-5": {
|
|
7171
|
+
provider: "anthropic",
|
|
7172
|
+
family: "5",
|
|
7173
|
+
providerModelId: "claude-haiku-5-5",
|
|
7174
|
+
manifestSelectable: false
|
|
7153
7175
|
},
|
|
7154
7176
|
"claude-sonnet-4-6": {
|
|
7155
7177
|
provider: "anthropic",
|
|
7156
7178
|
family: "4.6",
|
|
7157
|
-
providerModelId: "claude-sonnet-4-6"
|
|
7179
|
+
providerModelId: "claude-sonnet-4-6",
|
|
7180
|
+
manifestSelectable: true
|
|
7158
7181
|
},
|
|
7159
7182
|
"claude-haiku-4-5": {
|
|
7160
7183
|
provider: "anthropic",
|
|
7161
7184
|
family: "4.5",
|
|
7162
|
-
providerModelId: "claude-haiku-4-5"
|
|
7185
|
+
providerModelId: "claude-haiku-4-5",
|
|
7186
|
+
manifestSelectable: true
|
|
7163
7187
|
},
|
|
7164
7188
|
"deepseek-v4-flash": {
|
|
7165
7189
|
provider: "openrouter",
|
|
7166
7190
|
family: "deepseek",
|
|
7167
|
-
providerModelId: "deepseek/deepseek-v4-flash-0731"
|
|
7191
|
+
providerModelId: "deepseek/deepseek-v4-flash-0731",
|
|
7192
|
+
manifestSelectable: true
|
|
7168
7193
|
},
|
|
7169
7194
|
"deepseek-v4-pro": {
|
|
7170
7195
|
provider: "openrouter",
|
|
7171
7196
|
family: "deepseek",
|
|
7172
|
-
providerModelId: "deepseek/deepseek-v4-pro"
|
|
7197
|
+
providerModelId: "deepseek/deepseek-v4-pro",
|
|
7198
|
+
manifestSelectable: true
|
|
7173
7199
|
},
|
|
7174
7200
|
"mimo-v2.5": {
|
|
7175
7201
|
provider: "openrouter",
|
|
7176
7202
|
family: "mimo",
|
|
7177
|
-
providerModelId: "xiaomi/mimo-v2.5"
|
|
7203
|
+
providerModelId: "xiaomi/mimo-v2.5",
|
|
7204
|
+
manifestSelectable: true
|
|
7178
7205
|
},
|
|
7179
7206
|
"mimo-v2.5-pro": {
|
|
7180
7207
|
provider: "openrouter",
|
|
7181
7208
|
family: "mimo",
|
|
7182
|
-
providerModelId: "xiaomi/mimo-v2.5-pro"
|
|
7209
|
+
providerModelId: "xiaomi/mimo-v2.5-pro",
|
|
7210
|
+
manifestSelectable: true
|
|
7183
7211
|
},
|
|
7184
7212
|
"glm-5.2": {
|
|
7185
7213
|
provider: "openrouter",
|
|
7186
7214
|
family: "glm",
|
|
7187
|
-
providerModelId: "z-ai/glm-5.2"
|
|
7215
|
+
providerModelId: "z-ai/glm-5.2",
|
|
7216
|
+
manifestSelectable: true
|
|
7188
7217
|
}
|
|
7189
7218
|
};
|
|
7190
7219
|
var SUPPORTED_LLM_MODELS = Object.keys(MODEL_CATALOG);
|
|
7191
7220
|
var SUPPORTED_SEARCH_MODELS = SUPPORTED_LLM_MODELS.filter(supportsWebSearch);
|
|
7221
|
+
var MANIFEST_LLM_MODELS = SUPPORTED_LLM_MODELS.filter((modelId) => MODEL_CATALOG[modelId].manifestSelectable);
|
|
7222
|
+
var MANIFEST_SEARCH_MODELS = MANIFEST_LLM_MODELS.filter((modelId) => supportsWebSearch(modelId));
|
|
7192
7223
|
function supportsWebSearch(modelId) {
|
|
7193
7224
|
const { provider } = MODEL_CATALOG[modelId];
|
|
7194
7225
|
return provider === "gemini" || provider === "anthropic";
|
|
@@ -26894,6 +26925,159 @@ var admitUsersResponseSchema = external_exports.object({
|
|
|
26894
26925
|
})
|
|
26895
26926
|
});
|
|
26896
26927
|
|
|
26928
|
+
// ../../packages/core/dist/esm/schemas/usage-billing.schema.js
|
|
26929
|
+
var UsageBillingProductSchema = external_exports.literal("automations");
|
|
26930
|
+
var USAGE_BILLING_BLOCK_REASONS = [
|
|
26931
|
+
"insufficient_credit",
|
|
26932
|
+
"temporarily_unavailable"
|
|
26933
|
+
];
|
|
26934
|
+
var USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS = [
|
|
26935
|
+
...USAGE_BILLING_BLOCK_REASONS,
|
|
26936
|
+
"no_billing_account"
|
|
26937
|
+
];
|
|
26938
|
+
var UsageBillingAuthorizationDenialReasonSchema = external_exports.enum(USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS);
|
|
26939
|
+
var UsageBillingBlockReasonSchema = external_exports.enum(USAGE_BILLING_BLOCK_REASONS);
|
|
26940
|
+
var UsageBillingAccountSchema = external_exports.object({
|
|
26941
|
+
id: external_exports.string().regex(/^[1-9]\d*$/),
|
|
26942
|
+
type: external_exports.literal("user")
|
|
26943
|
+
});
|
|
26944
|
+
var RESERVATION_ID_MAX_LENGTH = 100;
|
|
26945
|
+
var EXTERNAL_EVENT_ID_MAX_LENGTH = 100;
|
|
26946
|
+
var CATEGORY_MAX_LENGTH = 64;
|
|
26947
|
+
var AuthorizeUsageRequestSchema = external_exports.object({
|
|
26948
|
+
product: UsageBillingProductSchema,
|
|
26949
|
+
account: UsageBillingAccountSchema,
|
|
26950
|
+
reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
|
|
26951
|
+
category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH)
|
|
26952
|
+
});
|
|
26953
|
+
var UsageBillingUnitsSchema = external_exports.number().int().nonnegative();
|
|
26954
|
+
var UsageBillingBalanceSchema = external_exports.number().int();
|
|
26955
|
+
var RecordUsageRefsSchema = external_exports.record(external_exports.string().max(40), external_exports.string().max(500)).refine((refs) => Object.keys(refs).length <= 50);
|
|
26956
|
+
var AuthorizeUsageResponseSchema = external_exports.discriminatedUnion("decision", [
|
|
26957
|
+
external_exports.object({
|
|
26958
|
+
decision: external_exports.literal("allowed"),
|
|
26959
|
+
reservation_id: external_exports.string().min(1),
|
|
26960
|
+
available_units: UsageBillingBalanceSchema
|
|
26961
|
+
}),
|
|
26962
|
+
external_exports.object({
|
|
26963
|
+
decision: external_exports.literal("denied"),
|
|
26964
|
+
reason: UsageBillingAuthorizationDenialReasonSchema,
|
|
26965
|
+
available_units: UsageBillingBalanceSchema
|
|
26966
|
+
})
|
|
26967
|
+
]);
|
|
26968
|
+
var RecordUsageRequestSchema = external_exports.object({
|
|
26969
|
+
product: UsageBillingProductSchema,
|
|
26970
|
+
account: UsageBillingAccountSchema,
|
|
26971
|
+
reservation_id: external_exports.string().min(1).max(RESERVATION_ID_MAX_LENGTH),
|
|
26972
|
+
external_event_id: external_exports.string().min(1).max(EXTERNAL_EVENT_ID_MAX_LENGTH).refine((value) => !value.startsWith("reservation:")),
|
|
26973
|
+
category: external_exports.string().min(1).max(CATEGORY_MAX_LENGTH),
|
|
26974
|
+
status: external_exports.enum(["success", "failed", "cancelled", "timed_out", "partial"]),
|
|
26975
|
+
incurred_cost: external_exports.number().int().nonnegative(),
|
|
26976
|
+
refs: RecordUsageRefsSchema.optional(),
|
|
26977
|
+
description: external_exports.string().min(1).max(255)
|
|
26978
|
+
});
|
|
26979
|
+
var RecordUsageResponseSchema = external_exports.object({
|
|
26980
|
+
recorded: external_exports.boolean(),
|
|
26981
|
+
charged_units: UsageBillingUnitsSchema,
|
|
26982
|
+
available_units: UsageBillingBalanceSchema
|
|
26983
|
+
});
|
|
26984
|
+
var TOP_UP_USD_MIN_AMOUNT = 500;
|
|
26985
|
+
var TopUpCurrencySchema = external_exports.preprocess((value) => typeof value === "string" ? value.toLowerCase() : value, external_exports.literal("usd"));
|
|
26986
|
+
var StartTopUpRequestSchema = external_exports.object({
|
|
26987
|
+
amount: external_exports.number().int().min(TOP_UP_USD_MIN_AMOUNT),
|
|
26988
|
+
// The public OpenAPI example uses lowercase `usd`; the backend also
|
|
26989
|
+
// normalizes caller casing before checking the currently supported currency.
|
|
26990
|
+
currency: TopUpCurrencySchema,
|
|
26991
|
+
return_url: external_exports.url()
|
|
26992
|
+
});
|
|
26993
|
+
var StartTopUpResponseSchema = external_exports.object({
|
|
26994
|
+
session_id: external_exports.string().min(1),
|
|
26995
|
+
checkout_url: external_exports.url()
|
|
26996
|
+
});
|
|
26997
|
+
var BillingPortalUrlRequestSchema = external_exports.object({
|
|
26998
|
+
return_url: external_exports.url()
|
|
26999
|
+
});
|
|
27000
|
+
var BillingPortalUrlResponseSchema = external_exports.object({
|
|
27001
|
+
billing_portal_url: external_exports.url()
|
|
27002
|
+
});
|
|
27003
|
+
var ReadStateResponseSchema = external_exports.object({
|
|
27004
|
+
available_units: UsageBillingBalanceSchema,
|
|
27005
|
+
available_amount: UsageBillingBalanceSchema,
|
|
27006
|
+
currency: external_exports.string(),
|
|
27007
|
+
usage_allowed: external_exports.boolean(),
|
|
27008
|
+
low_balance: external_exports.boolean(),
|
|
27009
|
+
depleted: external_exports.boolean(),
|
|
27010
|
+
/**
|
|
27011
|
+
* Additive hold-free snapshot. These fields remain optional until every
|
|
27012
|
+
* Todoist producer emits them, and balances may be overdrawn after a
|
|
27013
|
+
* settlement.
|
|
27014
|
+
*/
|
|
27015
|
+
settled_units: UsageBillingBalanceSchema.optional(),
|
|
27016
|
+
settled_amount: UsageBillingBalanceSchema.optional(),
|
|
27017
|
+
is_settled_low_balance: external_exports.boolean().optional(),
|
|
27018
|
+
usage_block_reason: UsageBillingBlockReasonSchema.nullable().optional()
|
|
27019
|
+
});
|
|
27020
|
+
var UsageBillingAmountSchema = UsageBillingUnitsSchema.nullable();
|
|
27021
|
+
var UsageBillingEntrySchema = external_exports.object({
|
|
27022
|
+
id: external_exports.number().int().positive(),
|
|
27023
|
+
type: external_exports.string().min(1),
|
|
27024
|
+
created_at: external_exports.iso.datetime(),
|
|
27025
|
+
category: external_exports.string().min(1).optional(),
|
|
27026
|
+
status: external_exports.string().min(1).optional(),
|
|
27027
|
+
charged_units: UsageBillingAmountSchema,
|
|
27028
|
+
/** `charged_units` in integer microdollars. `null` exactly when it is. */
|
|
27029
|
+
charged_amount: UsageBillingAmountSchema,
|
|
27030
|
+
credited_units: UsageBillingAmountSchema,
|
|
27031
|
+
/** `credited_units` in integer microdollars. `null` exactly when it is. */
|
|
27032
|
+
credited_amount: UsageBillingAmountSchema,
|
|
27033
|
+
refs: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
27034
|
+
description: external_exports.string().optional()
|
|
27035
|
+
}).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" });
|
|
27036
|
+
var USAGE_BILLING_ENTRY_TYPES = [
|
|
27037
|
+
"usage_settled",
|
|
27038
|
+
"top_up",
|
|
27039
|
+
"adjustment",
|
|
27040
|
+
"void",
|
|
27041
|
+
"expiry",
|
|
27042
|
+
"chargeback"
|
|
27043
|
+
];
|
|
27044
|
+
var UsageBillingEntryTypeSchema = external_exports.enum(USAGE_BILLING_ENTRY_TYPES);
|
|
27045
|
+
var ReadTransactionsResponseSchema = external_exports.object({
|
|
27046
|
+
/**
|
|
27047
|
+
* On the page rather than on each entry: an account pins one price for its
|
|
27048
|
+
* whole life, so no two entries can differ.
|
|
27049
|
+
*/
|
|
27050
|
+
currency: external_exports.string(),
|
|
27051
|
+
entries: external_exports.array(UsageBillingEntrySchema),
|
|
27052
|
+
has_more: external_exports.boolean(),
|
|
27053
|
+
/** Absent on the last page. */
|
|
27054
|
+
next_cursor: external_exports.string().min(1).optional()
|
|
27055
|
+
});
|
|
27056
|
+
var ReadUsageSummaryRequestSchema = external_exports.object({
|
|
27057
|
+
/** Omit to total every category. */
|
|
27058
|
+
category: external_exports.string().min(1).optional(),
|
|
27059
|
+
/** Start of the window, inclusive. Omit to start at the account's first event. */
|
|
27060
|
+
since: external_exports.iso.datetime().optional(),
|
|
27061
|
+
/** End of the window, exclusive. Omit to run to now. */
|
|
27062
|
+
until: external_exports.iso.datetime().optional()
|
|
27063
|
+
});
|
|
27064
|
+
var ReadUsageSummaryResponseSchema = external_exports.object({
|
|
27065
|
+
currency: external_exports.string(),
|
|
27066
|
+
usage_count: UsageBillingUnitsSchema,
|
|
27067
|
+
charged_units: UsageBillingUnitsSchema,
|
|
27068
|
+
/** `charged_units` in integer microdollars. `0` on an account with no usage. */
|
|
27069
|
+
charged_amount: UsageBillingUnitsSchema
|
|
27070
|
+
});
|
|
27071
|
+
var GrantWelcomeCreditRequestSchema = external_exports.object({
|
|
27072
|
+
product: UsageBillingProductSchema,
|
|
27073
|
+
account: UsageBillingAccountSchema,
|
|
27074
|
+
operator: external_exports.email().max(254)
|
|
27075
|
+
});
|
|
27076
|
+
var GrantWelcomeCreditResponseSchema = external_exports.object({
|
|
27077
|
+
status: external_exports.enum(["granted", "already_granted"]),
|
|
27078
|
+
grant_id: external_exports.string().min(1)
|
|
27079
|
+
});
|
|
27080
|
+
|
|
26897
27081
|
// ../../packages/core/dist/esm/types/failure-category.types.js
|
|
26898
27082
|
var FAILURE_CATEGORIES = [
|
|
26899
27083
|
"mcp_upstream_unavailable",
|
|
@@ -26918,7 +27102,7 @@ var FAILURE_CATEGORIES = [
|
|
|
26918
27102
|
"billing_unavailable",
|
|
26919
27103
|
"unknown"
|
|
26920
27104
|
];
|
|
26921
|
-
var SKIP_CATEGORIES =
|
|
27105
|
+
var SKIP_CATEGORIES = USAGE_BILLING_AUTHORIZATION_DENIAL_REASONS;
|
|
26922
27106
|
|
|
26923
27107
|
// ../../packages/core/dist/esm/schemas/shared.schema.js
|
|
26924
27108
|
var RolloutCompatibleNullableStringSchema = external_exports.string().nullish().transform((value) => value ?? null);
|
|
@@ -27522,7 +27706,12 @@ var ConnectorSchema = external_exports.object({
|
|
|
27522
27706
|
* connection types — one onboarding covers both action and trigger uses.
|
|
27523
27707
|
* The FE collapses per-type rows into a single account when this is true.
|
|
27524
27708
|
*/
|
|
27525
|
-
isManaged: external_exports.boolean().optional()
|
|
27709
|
+
isManaged: external_exports.boolean().optional(),
|
|
27710
|
+
/**
|
|
27711
|
+
* The service only admits loopback OAuth clients, so account setup runs in
|
|
27712
|
+
* the Automations CLI on the user's machine instead of the web app.
|
|
27713
|
+
*/
|
|
27714
|
+
connectsViaCli: external_exports.boolean().optional()
|
|
27526
27715
|
});
|
|
27527
27716
|
var GetConnectorsQuerySchema = external_exports.object({
|
|
27528
27717
|
query: external_exports.string().optional()
|
|
@@ -27548,6 +27737,11 @@ var connectorListResponseSchema = external_exports.object({
|
|
|
27548
27737
|
nextCursor: external_exports.string().nullable()
|
|
27549
27738
|
});
|
|
27550
27739
|
|
|
27740
|
+
// ../../packages/core/dist/esm/utils/cli-command.js
|
|
27741
|
+
function connectViaCliCommand(connectorId, capability) {
|
|
27742
|
+
return `tda connector connect ${connectorId} --capability ${capability}`;
|
|
27743
|
+
}
|
|
27744
|
+
|
|
27551
27745
|
// ../../packages/core/dist/esm/utils/duration.js
|
|
27552
27746
|
var durationUnits = ["ms", "s", "m", "h", "d", "w"];
|
|
27553
27747
|
var createDurationPattern = (units) => units.join("|");
|
|
@@ -27915,7 +28109,7 @@ var baseStepSchema = external_exports.object({
|
|
|
27915
28109
|
})
|
|
27916
28110
|
});
|
|
27917
28111
|
var MODEL_TIERS = ["lite", "flash", "pro"];
|
|
27918
|
-
var SUPPORTED_MODEL_REFERENCES = [...MODEL_TIERS, ...
|
|
28112
|
+
var SUPPORTED_MODEL_REFERENCES = [...MODEL_TIERS, ...MANIFEST_LLM_MODELS];
|
|
27919
28113
|
var modelReferenceSchema = external_exports.enum(SUPPORTED_MODEL_REFERENCES).meta({
|
|
27920
28114
|
description: "A stable model tier (lite, flash, pro) or a supported literal model override."
|
|
27921
28115
|
});
|
|
@@ -27971,7 +28165,7 @@ var searchStepSchema = baseStepSchema.merge(external_exports.object({
|
|
|
27971
28165
|
description: "The search prompt to execute using web search."
|
|
27972
28166
|
}),
|
|
27973
28167
|
outputSchema: searchStepOutputSchema,
|
|
27974
|
-
model: external_exports.enum([...MODEL_TIERS, ...
|
|
28168
|
+
model: external_exports.enum([...MODEL_TIERS, ...MANIFEST_SEARCH_MODELS]).optional().meta({
|
|
27975
28169
|
description: "A stable tier (lite, flash, pro) or a supported search-enabled literal model override."
|
|
27976
28170
|
})
|
|
27977
28171
|
}));
|
|
@@ -28600,6 +28794,29 @@ var CreateConnectionParamsSchema = external_exports.object({
|
|
|
28600
28794
|
var CreateConnectionBodySchema = external_exports.object({
|
|
28601
28795
|
automationIds: external_exports.array(external_exports.uuid()).optional()
|
|
28602
28796
|
});
|
|
28797
|
+
var ImportLocalOAuthConnectionBodySchema = external_exports.object({
|
|
28798
|
+
/** The public client the CLI registered; the server bound the grant to it. */
|
|
28799
|
+
clientId: external_exports.string().min(1),
|
|
28800
|
+
accessToken: external_exports.string().min(1),
|
|
28801
|
+
refreshToken: external_exports.string().min(1).optional(),
|
|
28802
|
+
/** Seconds until `accessToken` expires, as the token endpoint reported it. */
|
|
28803
|
+
expiresIn: external_exports.number().int().positive().optional(),
|
|
28804
|
+
/**
|
|
28805
|
+
* A broken connection of the caller's, for the same connector, whose
|
|
28806
|
+
* automation bindings move to the new grant when the account cannot be
|
|
28807
|
+
* matched to it.
|
|
28808
|
+
*/
|
|
28809
|
+
repairConnectionId: external_exports.uuid().optional()
|
|
28810
|
+
});
|
|
28811
|
+
var LocalOAuthSetupSchema = external_exports.object({
|
|
28812
|
+
/** RFC 7591 registration endpoint; null when the server offers none. */
|
|
28813
|
+
registrationEndpoint: external_exports.string().url().nullable(),
|
|
28814
|
+
authorizationEndpoint: external_exports.string().url(),
|
|
28815
|
+
tokenEndpoint: external_exports.string().url(),
|
|
28816
|
+
/** RFC 8707 resource indicator for the MCP server, when it advertises one. */
|
|
28817
|
+
resource: external_exports.string().url().nullable(),
|
|
28818
|
+
scopes: external_exports.array(external_exports.string())
|
|
28819
|
+
});
|
|
28603
28820
|
var OAuthConnectionSetupSchema = external_exports.object({
|
|
28604
28821
|
kind: external_exports.literal("oauth"),
|
|
28605
28822
|
authorizationUrl: external_exports.string().url()
|
|
@@ -29090,7 +29307,9 @@ var chatUsagePreviewSchema = external_exports.object({
|
|
|
29090
29307
|
var chatStreamRequestErrorResponseSchema = external_exports.object({
|
|
29091
29308
|
message: external_exports.string(),
|
|
29092
29309
|
statusCode: external_exports.number().int(),
|
|
29093
|
-
code: external_exports.enum(USAGE_BILLING_DENIAL_CODES).optional().catch(void 0)
|
|
29310
|
+
code: external_exports.enum(USAGE_BILLING_DENIAL_CODES).optional().catch(void 0),
|
|
29311
|
+
/** Present only when the server establishes whether work started. */
|
|
29312
|
+
execution_started: external_exports.boolean().optional()
|
|
29094
29313
|
});
|
|
29095
29314
|
var CHAT_CONVERSATION_STATUSES = ["active", "archived", "all"];
|
|
29096
29315
|
var chatConversationStatusSchema = external_exports.enum(CHAT_CONVERSATION_STATUSES);
|
|
@@ -29417,7 +29636,9 @@ var FRONTEND_COHORT_EVENTS = [
|
|
|
29417
29636
|
"chat:sent",
|
|
29418
29637
|
"automation:repaired",
|
|
29419
29638
|
"template:used",
|
|
29420
|
-
"top-up:completed"
|
|
29639
|
+
"top-up:completed",
|
|
29640
|
+
"guided-creation:started",
|
|
29641
|
+
"guided-creation:completed"
|
|
29421
29642
|
];
|
|
29422
29643
|
var BACKEND_COHORT_EVENTS = [
|
|
29423
29644
|
// API-process (publish lifecycle)
|
|
@@ -29825,140 +30046,6 @@ var subscriptionResponseSchema = external_exports.object({
|
|
|
29825
30046
|
updatedAt: external_exports.string()
|
|
29826
30047
|
});
|
|
29827
30048
|
|
|
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
30049
|
// ../../packages/core/dist/esm/schemas/user-settings.schema.js
|
|
29963
30050
|
var UserAccessStateSchema = external_exports.enum(["allowed", "waiting"]);
|
|
29964
30051
|
var UserOnboardingStateSchema = external_exports.object({
|
|
@@ -31305,6 +31392,7 @@ var connectionsEndpoints = {
|
|
|
31305
31392
|
token: (id) => `${root10}/${encodeURIComponent(id)}/token`,
|
|
31306
31393
|
dependentAutomations: (connectorId) => `${root10}/${encodeURIComponent(connectorId)}/automations`,
|
|
31307
31394
|
create: (connectorId, capability) => `${root10}/${encodeURIComponent(connectorId)}/${encodeURIComponent(capability)}`,
|
|
31395
|
+
localOAuth: (connectorId, capability) => `${root10}/${encodeURIComponent(connectorId)}/${encodeURIComponent(capability)}/local-oauth`,
|
|
31308
31396
|
checkManifest: `${root10}/check-manifest`
|
|
31309
31397
|
};
|
|
31310
31398
|
|
|
@@ -31384,6 +31472,41 @@ var ConnectionsClient = class extends BaseClient {
|
|
|
31384
31472
|
});
|
|
31385
31473
|
return CreateConnectionResponseSchema.parse(data);
|
|
31386
31474
|
}
|
|
31475
|
+
/**
|
|
31476
|
+
* The authorization server endpoints and scopes for running a
|
|
31477
|
+
* `connectsViaCli` connector's OAuth flow with a loopback client.
|
|
31478
|
+
*/
|
|
31479
|
+
async getLocalOAuthSetup(args, options) {
|
|
31480
|
+
const { connectorId, capability } = CreateConnectionParamsSchema.parse({
|
|
31481
|
+
connectorId: IdSchema.parse(args.connectorId),
|
|
31482
|
+
capability: args.capability
|
|
31483
|
+
});
|
|
31484
|
+
const data = await this.request({
|
|
31485
|
+
method: "GET",
|
|
31486
|
+
path: connectionsEndpoints.localOAuth(connectorId, capability),
|
|
31487
|
+
options
|
|
31488
|
+
});
|
|
31489
|
+
return LocalOAuthSetupSchema.parse(data);
|
|
31490
|
+
}
|
|
31491
|
+
/**
|
|
31492
|
+
* Stores a grant the CLI obtained with a loopback OAuth client, for a
|
|
31493
|
+
* connector whose authorization server admits no hosted clients
|
|
31494
|
+
* (`connectsViaCli`). The connection comes back already authorized.
|
|
31495
|
+
*/
|
|
31496
|
+
async importLocalOAuth(args, options) {
|
|
31497
|
+
const { connectorId, capability } = CreateConnectionParamsSchema.parse({
|
|
31498
|
+
connectorId: IdSchema.parse(args.connectorId),
|
|
31499
|
+
capability: args.capability
|
|
31500
|
+
});
|
|
31501
|
+
const body = ImportLocalOAuthConnectionBodySchema.parse(args.grant);
|
|
31502
|
+
const data = await this.request({
|
|
31503
|
+
method: "POST",
|
|
31504
|
+
path: connectionsEndpoints.localOAuth(connectorId, capability),
|
|
31505
|
+
body,
|
|
31506
|
+
options
|
|
31507
|
+
});
|
|
31508
|
+
return CreateConnectionResponseSchema.parse(data);
|
|
31509
|
+
}
|
|
31387
31510
|
async checkManifest(manifest, options) {
|
|
31388
31511
|
const parsedManifest = partialManifestSchema.parse(manifest);
|
|
31389
31512
|
const data = await this.request({
|
|
@@ -35794,6 +35917,13 @@ async function* streamConnectorNdjsonItems(api, options, signal) {
|
|
|
35794
35917
|
}
|
|
35795
35918
|
yield { _meta: true, connectionsIncluded: options.connections };
|
|
35796
35919
|
}
|
|
35920
|
+
async function findListedConnector(api, connectorId, signal) {
|
|
35921
|
+
for await (const page of iterateConnectorPages(api, void 0, { signal })) {
|
|
35922
|
+
const connector = page.data.find((candidate) => candidate.id === connectorId);
|
|
35923
|
+
if (connector) return connector;
|
|
35924
|
+
}
|
|
35925
|
+
return void 0;
|
|
35926
|
+
}
|
|
35797
35927
|
function findConnector2(api, connectorId, signal) {
|
|
35798
35928
|
return findConnector(api, connectorId, { signal });
|
|
35799
35929
|
}
|
|
@@ -35821,6 +35951,8 @@ async function runAuthorizationCommand(command, operation) {
|
|
|
35821
35951
|
return operation({
|
|
35822
35952
|
api,
|
|
35823
35953
|
signal,
|
|
35954
|
+
output: output2,
|
|
35955
|
+
openBrowser: options.open,
|
|
35824
35956
|
authorizer: new ApiConnectionAuthorizer({
|
|
35825
35957
|
connections: api.connections,
|
|
35826
35958
|
output: output2,
|
|
@@ -35910,17 +36042,172 @@ function summarizeAffectedAutomation(automation) {
|
|
|
35910
36042
|
};
|
|
35911
36043
|
}
|
|
35912
36044
|
|
|
36045
|
+
// src/commands/connector/local-oauth-connect.ts
|
|
36046
|
+
import { createDcrProvider, runOAuthFlow } from "@doist/cli-core/auth";
|
|
36047
|
+
var PREFERRED_CALLBACK_PORT = 24369;
|
|
36048
|
+
async function connectViaLocalOAuth({
|
|
36049
|
+
api,
|
|
36050
|
+
connector,
|
|
36051
|
+
capability,
|
|
36052
|
+
repairConnectionId,
|
|
36053
|
+
output: output2,
|
|
36054
|
+
openBrowser,
|
|
36055
|
+
signal
|
|
36056
|
+
}) {
|
|
36057
|
+
const setup = await api.connections.getLocalOAuthSetup(
|
|
36058
|
+
{ connectorId: connector.id, capability },
|
|
36059
|
+
{ signal }
|
|
36060
|
+
);
|
|
36061
|
+
const { registrationEndpoint } = setup;
|
|
36062
|
+
if (!registrationEndpoint) {
|
|
36063
|
+
throw new Error(
|
|
36064
|
+
`${connector.name} does not support dynamic client registration, so the CLI cannot connect it.`
|
|
36065
|
+
);
|
|
36066
|
+
}
|
|
36067
|
+
const grant = await runLoopbackGrant({
|
|
36068
|
+
connector,
|
|
36069
|
+
capability,
|
|
36070
|
+
setup,
|
|
36071
|
+
registrationEndpoint,
|
|
36072
|
+
output: output2,
|
|
36073
|
+
openBrowser,
|
|
36074
|
+
signal
|
|
36075
|
+
});
|
|
36076
|
+
const created = await api.connections.importLocalOAuth(
|
|
36077
|
+
{
|
|
36078
|
+
connectorId: connector.id,
|
|
36079
|
+
capability,
|
|
36080
|
+
grant: {
|
|
36081
|
+
clientId: grant.account.clientId,
|
|
36082
|
+
accessToken: grant.bundle.accessToken,
|
|
36083
|
+
refreshToken: grant.bundle.refreshToken,
|
|
36084
|
+
expiresIn: expiresInSeconds(grant.bundle.accessTokenExpiresAt),
|
|
36085
|
+
...repairConnectionId ? { repairConnectionId } : {}
|
|
36086
|
+
}
|
|
36087
|
+
},
|
|
36088
|
+
{ signal }
|
|
36089
|
+
);
|
|
36090
|
+
output2.emit({
|
|
36091
|
+
type: "connection_authorized",
|
|
36092
|
+
connectionId: created.connectionId,
|
|
36093
|
+
connectorId: connector.id,
|
|
36094
|
+
serviceName: connector.name,
|
|
36095
|
+
connectionType: capability,
|
|
36096
|
+
state: "completed",
|
|
36097
|
+
terminal: false
|
|
36098
|
+
});
|
|
36099
|
+
return created.connectionId;
|
|
36100
|
+
}
|
|
36101
|
+
async function runLoopbackGrant({
|
|
36102
|
+
connector,
|
|
36103
|
+
capability,
|
|
36104
|
+
setup,
|
|
36105
|
+
registrationEndpoint,
|
|
36106
|
+
output: output2,
|
|
36107
|
+
openBrowser,
|
|
36108
|
+
signal
|
|
36109
|
+
}) {
|
|
36110
|
+
const retryHint = `Try again: ${connectViaCliCommand(connector.id, capability)}`;
|
|
36111
|
+
const provider = createDcrProvider({
|
|
36112
|
+
registrationUrl: registrationEndpoint,
|
|
36113
|
+
authorizeUrl: setup.authorizationEndpoint,
|
|
36114
|
+
tokenUrl: setup.tokenEndpoint,
|
|
36115
|
+
resource: setup.resource ?? void 0,
|
|
36116
|
+
clientMetadata: {
|
|
36117
|
+
clientName: AUTOMATIONS_CLI_CLIENT_NAME,
|
|
36118
|
+
logoUri: AUTOMATIONS_CLI_LOGO_URL,
|
|
36119
|
+
applicationType: "native",
|
|
36120
|
+
// The backend refreshes with the client id alone, so the client
|
|
36121
|
+
// must be public: no secret to copy across.
|
|
36122
|
+
tokenEndpointAuthMethod: "none",
|
|
36123
|
+
grantTypes: ["authorization_code", "refresh_token"]
|
|
36124
|
+
},
|
|
36125
|
+
// The grant is handed to the backend as-is; here the "account" only
|
|
36126
|
+
// carries the client id the server bound it to.
|
|
36127
|
+
validate: async ({ handshake }) => ({
|
|
36128
|
+
id: connector.id,
|
|
36129
|
+
label: connector.name,
|
|
36130
|
+
clientId: requireClientId(handshake)
|
|
36131
|
+
}),
|
|
36132
|
+
errorHints: [retryHint]
|
|
36133
|
+
});
|
|
36134
|
+
let captured;
|
|
36135
|
+
const store2 = {
|
|
36136
|
+
active: async () => null,
|
|
36137
|
+
set: async () => {
|
|
36138
|
+
},
|
|
36139
|
+
setBundle: async (account, bundle) => {
|
|
36140
|
+
captured = { account, bundle };
|
|
36141
|
+
},
|
|
36142
|
+
clear: async () => null,
|
|
36143
|
+
list: async () => [],
|
|
36144
|
+
setDefault: async () => {
|
|
36145
|
+
}
|
|
36146
|
+
};
|
|
36147
|
+
await runOAuthFlow({
|
|
36148
|
+
provider,
|
|
36149
|
+
store: store2,
|
|
36150
|
+
scopes: setup.scopes,
|
|
36151
|
+
readOnly: false,
|
|
36152
|
+
flags: {},
|
|
36153
|
+
preferredPort: PREFERRED_CALLBACK_PORT,
|
|
36154
|
+
renderSuccess: renderAuthSuccessPage,
|
|
36155
|
+
renderError: renderAuthErrorPage,
|
|
36156
|
+
...openBrowser ? {} : { openBrowser: async () => {
|
|
36157
|
+
} },
|
|
36158
|
+
onAuthorizeUrl: (url2) => {
|
|
36159
|
+
output2.emit({
|
|
36160
|
+
type: "connection_authorization_started",
|
|
36161
|
+
connectorId: connector.id,
|
|
36162
|
+
serviceName: connector.name,
|
|
36163
|
+
connectionType: capability,
|
|
36164
|
+
state: "waiting_for_user",
|
|
36165
|
+
terminal: false,
|
|
36166
|
+
setupKind: "oauth",
|
|
36167
|
+
authorizationUrl: url2
|
|
36168
|
+
});
|
|
36169
|
+
},
|
|
36170
|
+
timeoutMs: CONNECTION_AUTHORIZATION_TIMEOUT_MS,
|
|
36171
|
+
signal
|
|
36172
|
+
});
|
|
36173
|
+
if (!captured) {
|
|
36174
|
+
throw new Error(`${connector.name} sign-in finished without a token. ${retryHint}`);
|
|
36175
|
+
}
|
|
36176
|
+
return captured;
|
|
36177
|
+
}
|
|
36178
|
+
function requireClientId(handshake) {
|
|
36179
|
+
const clientId = handshake.clientId;
|
|
36180
|
+
if (typeof clientId !== "string" || clientId.length === 0) {
|
|
36181
|
+
throw new Error("The authorization server did not return a client id.");
|
|
36182
|
+
}
|
|
36183
|
+
return clientId;
|
|
36184
|
+
}
|
|
36185
|
+
function expiresInSeconds(expiresAt) {
|
|
36186
|
+
if (expiresAt === void 0) return void 0;
|
|
36187
|
+
const seconds = Math.floor((expiresAt - Date.now()) / 1e3);
|
|
36188
|
+
return seconds > 0 ? seconds : void 0;
|
|
36189
|
+
}
|
|
36190
|
+
|
|
35913
36191
|
// src/commands/connector/mutation-commands.ts
|
|
35914
36192
|
function registerConnectorMutationCommands(connector) {
|
|
35915
36193
|
connector.command("connect").description("Create a service connection and wait for authorization").argument("<connector-id>", "Connector ID").addOption(
|
|
35916
36194
|
new Option4("--capability <capability>", "Capability to authorize").choices(["mcp", "trigger"]).makeOptionMandatory()
|
|
35917
36195
|
).action(async (connectorId, options, command) => {
|
|
35918
|
-
await runAuthorizationCommand(command, async (
|
|
36196
|
+
await runAuthorizationCommand(command, async (context) => {
|
|
36197
|
+
const { api, authorizer, signal } = context;
|
|
35919
36198
|
const selected2 = await findConnector2(api, connectorId, signal);
|
|
35920
36199
|
assertConnectorSupportsCapability(selected2, options.capability);
|
|
35921
36200
|
if (!selected2.requiresConnection) {
|
|
35922
36201
|
throw new Error(`${selected2.name} does not require a connection.`);
|
|
35923
36202
|
}
|
|
36203
|
+
if (selected2.connectsViaCli) {
|
|
36204
|
+
const connectionId2 = await connectViaLocalOAuth({
|
|
36205
|
+
...context,
|
|
36206
|
+
connector: selected2,
|
|
36207
|
+
capability: options.capability
|
|
36208
|
+
});
|
|
36209
|
+
return { action: "connected", connectionId: connectionId2 };
|
|
36210
|
+
}
|
|
35924
36211
|
const connectionId = await authorizer.authorize(
|
|
35925
36212
|
{
|
|
35926
36213
|
connectorId: selected2.id,
|
|
@@ -35957,7 +36244,8 @@ function registerConnectorMutationCommands(connector) {
|
|
|
35957
36244
|
});
|
|
35958
36245
|
});
|
|
35959
36246
|
connector.command("repair").description("Start a replacement setup for a broken or expired connection").argument("<connection-id>", "Connection ID").action(async (connectionId, _options, command) => {
|
|
35960
|
-
await runAuthorizationCommand(command, async (
|
|
36247
|
+
await runAuthorizationCommand(command, async (context) => {
|
|
36248
|
+
const { api, authorizer, signal } = context;
|
|
35961
36249
|
const connection = await api.connections.get(connectionId, { signal });
|
|
35962
36250
|
if (connection.status === "authorized") {
|
|
35963
36251
|
throw new Error(`Connection ${connectionId} is already authorized.`);
|
|
@@ -35971,7 +36259,19 @@ function registerConnectorMutationCommands(connector) {
|
|
|
35971
36259
|
await authorizer.resume(request2, connection.id, connection.setup, signal);
|
|
35972
36260
|
return { action: "connected", connectionId };
|
|
35973
36261
|
}
|
|
35974
|
-
const affectedAutomations = await
|
|
36262
|
+
const [selected2, affectedAutomations] = await Promise.all([
|
|
36263
|
+
findListedConnector(api, connection.connectorId, signal),
|
|
36264
|
+
findAffectedAutomations(api, connectionId, signal)
|
|
36265
|
+
]);
|
|
36266
|
+
if (selected2?.connectsViaCli) {
|
|
36267
|
+
const repairedConnectionId2 = await connectViaLocalOAuth({
|
|
36268
|
+
...context,
|
|
36269
|
+
connector: selected2,
|
|
36270
|
+
capability: request2.connectionType,
|
|
36271
|
+
repairConnectionId: connection.id
|
|
36272
|
+
});
|
|
36273
|
+
return { action: "connected", connectionId: repairedConnectionId2 };
|
|
36274
|
+
}
|
|
35975
36275
|
const repairedConnectionId = await authorizer.authorize(
|
|
35976
36276
|
{
|
|
35977
36277
|
...request2,
|