@duvoai/cli 1.77.0 → 1.77.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/bin/duvo.js +128 -13
  2. package/package.json +1 -1
package/dist/bin/duvo.js CHANGED
@@ -1469,6 +1469,7 @@ var updateTeamClaritySettingsSchema = z7.object({
1469
1469
  industry: z7.string().trim().max(255).nullable().optional(),
1470
1470
  annualRevenue: z7.number().nonnegative().nullable().optional()
1471
1471
  });
1472
+ var MAX_CLARITY_PROCESSING_FAILURE_REASON_LENGTH = 500;
1472
1473
  var clarityCaptureSchema = z7.object({
1473
1474
  id: z7.guid(),
1474
1475
  processId: z7.guid(),
@@ -1479,6 +1480,7 @@ var clarityCaptureSchema = z7.object({
1479
1480
  videoTranscript: z7.string().nullable(),
1480
1481
  documentFileName: z7.string().nullable().optional(),
1481
1482
  documentTextMetadata: clarityDocumentTextMetadataSchema.nullable().optional(),
1483
+ processingFailureReason: z7.string().max(MAX_CLARITY_PROCESSING_FAILURE_REASON_LENGTH).nullable().optional(),
1482
1484
  transcript: z7.array(conversationMessageSchema).nullable(),
1483
1485
  /**
1484
1486
  * Whether a non-empty interview transcript exists server-side. Set by
@@ -3559,7 +3561,14 @@ var clarityV2SnapshotStatusSchema = z8.enum([
3559
3561
  "draft",
3560
3562
  "generating"
3561
3563
  ]);
3562
- var clarityV2SnapshotCreatorTypeSchema = z8.enum(["human", "ai"]);
3564
+ var CLARITY_V2_SNAPSHOT_CREATOR_TYPES = [
3565
+ "human",
3566
+ "ai",
3567
+ "seed"
3568
+ ];
3569
+ var clarityV2SnapshotCreatorTypeSchema = extensibleEnum(
3570
+ CLARITY_V2_SNAPSHOT_CREATOR_TYPES
3571
+ );
3563
3572
  var CLARITY_INTERVIEW_AREA_STATUSES = [
3564
3573
  "not_started",
3565
3574
  "partial",
@@ -3684,6 +3693,7 @@ var MAX_INTERVIEW_FRAME_BASE64_BYTES = 1e7;
3684
3693
  var MAX_INTERVIEW_FRAMES_PER_TURN = 16;
3685
3694
  var MAX_INTERVIEW_FRAMES_PER_AUTO_SAVE = 20;
3686
3695
  var MAX_INTERVIEW_AUTO_SAVE_BATCH_BASE64_BYTES = 10 * 1024 * 1024;
3696
+ var INTERVIEW_RECORDING_PART_BYTES = 8 * 1024 * 1024;
3687
3697
  var MAX_INTERVIEW_TRANSCRIPT_ENTRIES = 5e3;
3688
3698
  var clarityInterviewFrameSchema = z9.object({
3689
3699
  base64: z9.string().max(MAX_INTERVIEW_FRAME_BASE64_BYTES),
@@ -3996,6 +4006,19 @@ var interviewUploadUrlsResponseSchema = z10.object({
3996
4006
  frameUploadUrls: z10.array(interviewFrameUploadSchema),
3997
4007
  expiresAt: z10.string()
3998
4008
  });
4009
+ var recordingPartQuerySchema = z10.object({
4010
+ type: clarityCaptureSubTypeSchema,
4011
+ screenshareStartTime: z10.coerce.number().int().nonnegative(),
4012
+ partCount: z10.coerce.number().int().min(1).max(4096)
4013
+ });
4014
+ var composeRecordingPartsBodySchema = z10.object({
4015
+ type: clarityCaptureSubTypeSchema,
4016
+ screenshareStartTime: z10.int().nonnegative(),
4017
+ partCount: z10.int().min(1).max(4096)
4018
+ });
4019
+ var composeRecordingPartsResponseSchema = z10.object({
4020
+ recordingGcsPath: z10.string()
4021
+ });
3999
4022
  var CLARITY_DOCUMENT_CONTENT_TYPES = [
4000
4023
  "application/pdf",
4001
4024
  "text/plain",
@@ -4162,7 +4185,7 @@ var versioningApiFields = {
4162
4185
  "Versioning state. Only one 'live' row per process at a time; drafts may be edited or generating before promotion."
4163
4186
  ),
4164
4187
  creator_type: clarityV2SnapshotCreatorTypeSchema.describe(
4165
- "Whether this row was created by a user edit ('human') or an AI pipeline run ('ai')."
4188
+ "Whether this row was created by a user edit ('human'), an AI pipeline run ('ai'), or a module template's seeded document ('seed'). The value set may grow; see x-extensible-enum."
4166
4189
  ),
4167
4190
  user_id: z12.guid().nullable().describe("Creator user id (the human who edited or triggered the run)."),
4168
4191
  sandbox_id: z12.string().nullable().describe("E2B sandbox id that produced AI rows; null for user edits."),
@@ -6745,6 +6768,7 @@ var INTEGRATION_SLUGS = [
6745
6768
  "duvo-computer-use-rdp",
6746
6769
  "eu-commodity-prices",
6747
6770
  "asana",
6771
+ "jira",
6748
6772
  "ssh",
6749
6773
  "scheduling",
6750
6774
  "github",
@@ -6806,6 +6830,7 @@ var SERVER_RESOLVED_MCP_URL_SLUGS = /* @__PURE__ */ new Set([
6806
6830
  "intercom",
6807
6831
  "github",
6808
6832
  "maersk",
6833
+ "jira",
6809
6834
  "dsv",
6810
6835
  "infor-nexus"
6811
6836
  ]);
@@ -12096,6 +12121,9 @@ var createTeamInvitationRequestSchema = z61.object({
12096
12121
  ),
12097
12122
  processId: z61.guid().optional().describe(
12098
12123
  "Invite the person to this Clarity process rather than the whole team. Requires the team:clarity-member role."
12124
+ ),
12125
+ process_role_id: z61.guid().optional().describe(
12126
+ "Configured Process role to assign alongside the Clarity invitation. Requires processId; the role must belong to that Process."
12099
12127
  )
12100
12128
  });
12101
12129
  var acceptTeamInvitationRequestSchema = z61.object({
@@ -15897,6 +15925,11 @@ var activeBannerSchema = z68.object({
15897
15925
  var activeBannerResponseSchema = z68.object({
15898
15926
  banner: activeBannerSchema.nullable()
15899
15927
  });
15928
+ function getUserAgentChatRoomName(userId, teamId) {
15929
+ return `user:${userId}:team:${teamId}:agent-chat`;
15930
+ }
15931
+ __name(getUserAgentChatRoomName, "getUserAgentChatRoomName");
15932
+ __name3(getUserAgentChatRoomName, "getUserAgentChatRoomName");
15900
15933
  var PLAN_FEATURE2 = {
15901
15934
  BROWSER_AUTOMATION: "browser_automation",
15902
15935
  ADVANCED_INTEGRATIONS: "advanced_integrations",
@@ -20218,6 +20251,7 @@ var updateTeamClaritySettingsSchema2 = z252.object({
20218
20251
  industry: z252.string().trim().max(255).nullable().optional(),
20219
20252
  annualRevenue: z252.number().nonnegative().nullable().optional()
20220
20253
  });
20254
+ var MAX_CLARITY_PROCESSING_FAILURE_REASON_LENGTH2 = 500;
20221
20255
  var clarityCaptureSchema2 = z252.object({
20222
20256
  id: z252.guid(),
20223
20257
  processId: z252.guid(),
@@ -20228,6 +20262,7 @@ var clarityCaptureSchema2 = z252.object({
20228
20262
  videoTranscript: z252.string().nullable(),
20229
20263
  documentFileName: z252.string().nullable().optional(),
20230
20264
  documentTextMetadata: clarityDocumentTextMetadataSchema2.nullable().optional(),
20265
+ processingFailureReason: z252.string().max(MAX_CLARITY_PROCESSING_FAILURE_REASON_LENGTH2).nullable().optional(),
20231
20266
  transcript: z252.array(conversationMessageSchema2).nullable(),
20232
20267
  /**
20233
20268
  * Whether a non-empty interview transcript exists server-side. Set by
@@ -21587,6 +21622,7 @@ var MAX_INTERVIEW_FRAME_BASE64_BYTES2 = 1e7;
21587
21622
  var MAX_INTERVIEW_FRAMES_PER_TURN2 = 16;
21588
21623
  var MAX_INTERVIEW_FRAMES_PER_AUTO_SAVE2 = 20;
21589
21624
  var MAX_INTERVIEW_AUTO_SAVE_BATCH_BASE64_BYTES2 = 10 * 1024 * 1024;
21625
+ var INTERVIEW_RECORDING_PART_BYTES2 = 8 * 1024 * 1024;
21590
21626
  var MAX_INTERVIEW_TRANSCRIPT_ENTRIES2 = 5e3;
21591
21627
  var clarityInterviewFrameSchema2 = z262.object({
21592
21628
  base64: z262.string().max(MAX_INTERVIEW_FRAME_BASE64_BYTES2),
@@ -25918,7 +25954,14 @@ var clarityV2SnapshotStatusSchema2 = z332.enum([
25918
25954
  "draft",
25919
25955
  "generating"
25920
25956
  ]);
25921
- var clarityV2SnapshotCreatorTypeSchema2 = z332.enum(["human", "ai"]);
25957
+ var CLARITY_V2_SNAPSHOT_CREATOR_TYPES2 = [
25958
+ "human",
25959
+ "ai",
25960
+ "seed"
25961
+ ];
25962
+ var clarityV2SnapshotCreatorTypeSchema2 = extensibleEnum2(
25963
+ CLARITY_V2_SNAPSHOT_CREATOR_TYPES2
25964
+ );
25922
25965
  var clarityInterviewVoiceProviderSchema2 = z342.enum([
25923
25966
  "OpenAi-realtime",
25924
25967
  "Google-live"
@@ -26195,6 +26238,19 @@ var interviewUploadUrlsResponseSchema2 = z342.object({
26195
26238
  frameUploadUrls: z342.array(interviewFrameUploadSchema2),
26196
26239
  expiresAt: z342.string()
26197
26240
  });
26241
+ var recordingPartQuerySchema2 = z342.object({
26242
+ type: clarityCaptureSubTypeSchema2,
26243
+ screenshareStartTime: z342.coerce.number().int().nonnegative(),
26244
+ partCount: z342.coerce.number().int().min(1).max(4096)
26245
+ });
26246
+ var composeRecordingPartsBodySchema2 = z342.object({
26247
+ type: clarityCaptureSubTypeSchema2,
26248
+ screenshareStartTime: z342.int().nonnegative(),
26249
+ partCount: z342.int().min(1).max(4096)
26250
+ });
26251
+ var composeRecordingPartsResponseSchema2 = z342.object({
26252
+ recordingGcsPath: z342.string()
26253
+ });
26198
26254
  var CLARITY_DOCUMENT_CONTENT_TYPES2 = [
26199
26255
  "application/pdf",
26200
26256
  "text/plain",
@@ -26361,7 +26417,7 @@ var versioningApiFields2 = {
26361
26417
  "Versioning state. Only one 'live' row per process at a time; drafts may be edited or generating before promotion."
26362
26418
  ),
26363
26419
  creator_type: clarityV2SnapshotCreatorTypeSchema2.describe(
26364
- "Whether this row was created by a user edit ('human') or an AI pipeline run ('ai')."
26420
+ "Whether this row was created by a user edit ('human'), an AI pipeline run ('ai'), or a module template's seeded document ('seed'). The value set may grow; see x-extensible-enum."
26365
26421
  ),
26366
26422
  user_id: z362.guid().nullable().describe("Creator user id (the human who edited or triggered the run)."),
26367
26423
  sandbox_id: z362.string().nullable().describe("E2B sandbox id that produced AI rows; null for user edits."),
@@ -28234,6 +28290,7 @@ var MCP_OAUTH_CATALOG_SERVER_URLS = {
28234
28290
  attio: "https://mcp.attio.com/mcp",
28235
28291
  amplitude: "https://mcp.amplitude.com/mcp",
28236
28292
  asana: "https://mcp.asana.com/v2/mcp",
28293
+ jira: "https://mcp.atlassian.com/v2/mcp",
28237
28294
  "notion-native": "https://mcp.notion.com/mcp",
28238
28295
  granola: "https://mcp.granola.ai/mcp",
28239
28296
  apify: "https://mcp.apify.com",
@@ -31709,6 +31766,7 @@ var INTEGRATION_SLUGS2 = [
31709
31766
  "duvo-computer-use-rdp",
31710
31767
  "eu-commodity-prices",
31711
31768
  "asana",
31769
+ "jira",
31712
31770
  "ssh",
31713
31771
  "scheduling",
31714
31772
  "github",
@@ -31771,6 +31829,7 @@ var SERVER_RESOLVED_MCP_URL_SLUGS2 = /* @__PURE__ */ new Set([
31771
31829
  "intercom",
31772
31830
  "github",
31773
31831
  "maersk",
31832
+ "jira",
31774
31833
  "dsv",
31775
31834
  "infor-nexus"
31776
31835
  ]);
@@ -35558,6 +35617,31 @@ var agentChatMessageMetadataSchema = z81.object({
35558
35617
  transport: z81.enum(AGENT_CHAT_TRANSPORTS),
35559
35618
  mcpServers: z81.array(z81.string().trim().min(1).max(80)).max(32),
35560
35619
  fallbackReason: z81.enum(AGENT_CHAT_RUNTIME_FALLBACK_REASONS).optional()
35620
+ }).optional(),
35621
+ /**
35622
+ * What this turn ran under: a digest of the Process grants, or the
35623
+ * `unrestricted` marker when the owner had no Process restriction.
35624
+ *
35625
+ * Written on EVERY dispatched turn, restricted or not, because the next turn
35626
+ * compares itself against it — a turn whose value differs does not resume the
35627
+ * model session the previous one produced. That covers a revoked dashboard, a
35628
+ * reassigned role and a team switch, and equally the unrestricted turn in
35629
+ * between two restricted ones, which would otherwise be invisible.
35630
+ *
35631
+ * Storing the digest rather than the grants keeps the sidecar from becoming a
35632
+ * second copy of the grant table; `queueCount` and `canActOnCases` are for
35633
+ * reading the transcript back in Chat Debugger, not for authorization, and are
35634
+ * written only for a restricted turn.
35635
+ *
35636
+ * Admin transcript only, like `runtime` and `skills` — not in the response
35637
+ * projection below.
35638
+ */
35639
+ process: z81.object({
35640
+ scopeFingerprint: z81.string().trim().min(1).max(64),
35641
+ queueCount: z81.number().int().min(0).max(1e4).optional(),
35642
+ canActOnCases: z81.boolean().optional(),
35643
+ /** Set when this turn started a fresh session because the grants changed. */
35644
+ sessionResetOnScopeChange: z81.boolean().optional()
35561
35645
  }).optional()
35562
35646
  });
35563
35647
  var agentChatMessageMetadataResponseSchema = z81.object({
@@ -38449,11 +38533,6 @@ var FEATURE_FLAG_CATALOGUE = {
38449
38533
  defaultValue: false,
38450
38534
  description: "Enables the Duvo help chat dock (bottom-right floating composer + history popover) and its backend routes. When disabled, the dock is hidden and /v1/agent-chats endpoints return 404; cc-server ingestion callback is unaffected."
38451
38535
  },
38452
- AGENT_CHAT_COMPOSER_V3: {
38453
- key: "agent_chat_composer_v3",
38454
- defaultValue: false,
38455
- description: "Swaps the Ask Duvo chat composer (rail, splash, and conversation surfaces) from the plain textarea to the Lexical editor with inline agent-mention pills. Frontend-only: messages serialize to the same <DUVO:AGENT_CONFIG> wire format, no backend behavior changes. Off-by-default for staged rollout; turning it off restores the V2 textarea composer."
38456
- },
38457
38536
  AGENT_CHAT_UI_RESOURCES: {
38458
38537
  key: "agent_chat_ui_resources",
38459
38538
  defaultValue: false,
@@ -38467,7 +38546,7 @@ var FEATURE_FLAG_CATALOGUE = {
38467
38546
  CASE_SCHEMA: {
38468
38547
  key: "case_schema",
38469
38548
  defaultValue: false,
38470
- description: "Per-team opt-in for typed Case payloads (versioned Case schemas on a queue). Gates the whole schema-management surface: the Case schema pill and its dialog in the Queue detail are hidden when off; the person-facing schema routes (get/create/replace/attach/detach/settings under /queues/:id/json-schema) and the agent-facing declare/get routes (/v1/case-queue/queues/:id/json-schema) 404 when off, which also disables the get_case_schema/declare_case_schema MCP tools and the `duvo queues schema` CLI commands that call them. It does NOT gate reading or writing cases (add_cases and the agent's case read path are ungated), so a queue that was already typed while the flag was on keeps its stored json_data and its consumers keep working \u2014 the flag governs whether a queue can be typed or its schema managed, not the execution of cases that already are. Off by default for staged rollout."
38549
+ description: "Per-team opt-in for typed Case payloads (versioned Case schemas on a queue), for STANDALONE queues only \u2014 a queue inside an Automation has typed Case schemas on whatever this flag says, since it is built and versioned as part of that Automation and its producing agent is expected to declare the shape it writes (see `isCaseSchemaEnabledForQueue`). For a standalone queue the flag gates the whole schema-management surface: the Case schema pill and its dialog in the Queue detail are hidden when off; the person-facing schema routes (get/create/replace/attach/detach/settings under /queues/:id/json-schema) and the agent-facing declare/get routes (/v1/case-queue/queues/:id/json-schema) 404 when off, which also disables the get_case_schema/declare_case_schema MCP tools and the `duvo queues schema` CLI commands that call them. It does NOT gate reading or writing cases (add_cases and the agent's case read path are ungated), so a queue that was already typed while the flag was on keeps its stored json_data and its consumers keep working \u2014 the flag governs whether a standalone queue can be typed or its schema managed, not the execution of cases that already are. Off by default for staged rollout."
38471
38550
  },
38472
38551
  CODE_STEPS: {
38473
38552
  key: "code_steps",
@@ -38554,6 +38633,11 @@ var FEATURE_FLAG_CATALOGUE = {
38554
38633
  defaultValue: false,
38555
38634
  description: "Read only while clarity_wss_first_transport is off (the INC-150 kill-switch path): superseded by clarity_sdp_proxy_wss_fallback, still honoured on its own so teams already enabled keep working. Routes interview WebRTC signaling through the Duvo backend. Retirement staged in #10298 once the kill switch itself retires."
38556
38635
  },
38636
+ CLARITY_INTERVIEW_UPLOAD_PROXY_FALLBACK: {
38637
+ key: "clarity_interview_upload_proxy_fallback",
38638
+ defaultValue: false,
38639
+ description: "Lets a Clarity interview finish on networks that block storage.googleapis.com. The browser still PUTs the recording straight to the GCS signed URL first; when that fails at the network level (the fetch rejects with no HTTP status) and this flag is on, the recording is uploaded through backend-node in 8 MiB parts that the backend composes into the same GCS object. Off by default: the fallback routes answer 404 and the client keeps today's direct-upload behaviour. Enable per team for customers whose interviewees sit behind corporate egress filters (DUVO-11549)."
38640
+ },
38557
38641
  CLARITY_INTERVIEW_WS_FALLBACK: {
38558
38642
  key: "clarity_interview_ws_fallback",
38559
38643
  defaultValue: false,
@@ -38619,6 +38703,11 @@ var FEATURE_FLAG_CATALOGUE = {
38619
38703
  defaultValue: true,
38620
38704
  description: "Allows staff to impersonate users who belong to the targeted tenant. Default ON. Turn off as a team or organization override to refuse execute for any target who is a member of that tenant \u2014 impersonation is user-level, so one disabled tenant among the target's memberships blocks the session. User-level overrides are ignored (this is a tenant policy, not a per-person toggle). Creating and ending a session are not gated. An already-live session is not revoked; it expires on its existing deadline. The Impersonate control stays visible; execute returns 403."
38621
38705
  },
38706
+ JIRA_CONNECTION: {
38707
+ key: "jira_connection",
38708
+ defaultValue: false,
38709
+ description: "Enables Jira connection setup through Atlassian MCP v2. Turning this off hides Jira and blocks setup and attachment to agents. Existing agents can continue to use saved connections and refresh their credentials."
38710
+ },
38622
38711
  MAERSK_CONNECTION: {
38623
38712
  key: "maersk_connection",
38624
38713
  defaultValue: false,
@@ -38724,6 +38813,16 @@ var FEATURE_FLAG_CATALOGUE = {
38724
38813
  defaultValue: false,
38725
38814
  description: "Per-team opt-in for the Freight Audit Module. Gates the Automation Modules surface: the 'Modules' entry at the top of the Process Automation sidebar section, the /teams/:teamId/modules page (which lists the Freight Audit module), and the module surfaces on the Automation detail page \u2014 an automation whose name matches a catalog module (currently 'Freight Audit') gets a 'Setup' tab with the static module overview, a 'Modules / {name}' breadcrumb, a 'Demo' badge, and a setup CTA in place of the revision switcher. When off, the nav entry is hidden, the page returns 404, and the detail page renders as a plain automation (a ?tab=setup deep link falls back to General). The surface additionally requires the team to be on the Automations workspace (`automations_migrated_at` stamped) \u2014 `lite` or `versioned`, since a Module installs into an automation and the installer writes the owning automation in whichever shape the team's model holds; for a standalone team the nav entry is hidden and the page redirects to Agents even with the flag on. Also gates the Ask Duvo card on Pulse dashboards: the generator may render a `[data-duvo-ask]` card whose submitted question opens Ask Duvo in the side panel on a fresh chat. When OFF, the frame strips any such card out of the dashboard before writing it in and the parent bridge is inert, so a dashboard built with a card renders without one rather than showing a control that does nothing. The card additionally requires AGENT_CHAT, since a question has nowhere to go without Ask Duvo. Also switches the Ask Duvo transcript to its business-clean reading experience: every consecutive tool call in a turn \u2014 including a subagent delegation and the subagent's own calls \u2014 folds into a single collapsed 'Duvo took N steps' row that expands on click into the individual tool cards, in place of the per-tool rows (and the nested delegation card) shown otherwise. Frontend-only and purely presentational: the running tool still surfaces as the activity-line verb, and turning the flag off restores the per-tool transcript with no data change. Off by default for staged rollout."
38726
38815
  },
38816
+ AUTOMATIONS_TO_MODULES: {
38817
+ key: "automations_to_modules",
38818
+ defaultValue: false,
38819
+ description: "Per-team opt-in for the Automations-to-Modules programme \u2014 the umbrella flag every step of that work is guarded by, so the whole programme can be shown to a team or pulled back in one switch. Step one is the frontend rebrand: the Automations entity reads as 'Module' / 'Modules' wherever a user meets it (sidebar entry, list and detail pages, breadcrumbs, side nav, dialogs, toasts, the Past Runs and Requests columns) and 'Create Automation' becomes 'Add Module'; Clarity's generated proposal reads as a 'Module proposal' to match. The 'Process Automation' sidebar section keeps its name \u2014 it names the product area, not the entity. Labels only: routes stay /teams/:teamId/automations/*, and no API, payload, or database naming changes, so the flag is a pure copy switch. When off (default), every one of those surfaces reads exactly as it does today. Off by default for staged rollout."
38820
+ },
38821
+ MODULE_SOLUTIONS_GALLERY: {
38822
+ key: "module_solutions_gallery",
38823
+ defaultValue: false,
38824
+ description: "Per-team opt-in for the Module Solutions gallery \u2014 the Explore section's 'Module Solutions' entry and the /teams/:teamId/solutions page, which lays the module catalog out as the supply-chain value chain. Exists for demoing our modules vision: the catalog is mostly placeholder modules mapping out the chain rather than wired surfaces, so it is shown to the teams a demo is being given to and nobody else. When off (default), the Explore section is hidden in the sidebar, the entry drops out of the command palette, and the page returns 404; a module's own /teams/:teamId/modules/:slug workspace is unaffected and keeps answering to FREIGHT_MODULE. Requires FREIGHT_MODULE and the team being on the Automations workspace (`automations_migrated_at` stamped) for the same reason the modules surface does \u2014 a Module installs into an automation, so a team with no workspace has nowhere to put one."
38825
+ },
38727
38826
  AUTOMATION_RUN_TOASTS: {
38728
38827
  key: "automation_run_toasts",
38729
38828
  defaultValue: false,
@@ -40272,6 +40371,9 @@ var createTeamInvitationRequestSchema2 = z123.object({
40272
40371
  ),
40273
40372
  processId: z123.guid().optional().describe(
40274
40373
  "Invite the person to this Clarity process rather than the whole team. Requires the team:clarity-member role."
40374
+ ),
40375
+ process_role_id: z123.guid().optional().describe(
40376
+ "Configured Process role to assign alongside the Clarity invitation. Requires processId; the role must belong to that Process."
40275
40377
  )
40276
40378
  });
40277
40379
  var acceptTeamInvitationRequestSchema2 = z123.object({
@@ -49683,7 +49785,8 @@ var IMAGE_CONTENT_TYPES = {
49683
49785
  ".png": "image/png",
49684
49786
  ".jpg": "image/jpeg",
49685
49787
  ".jpeg": "image/jpeg",
49686
- ".webp": "image/webp"
49788
+ ".webp": "image/webp",
49789
+ ".svg": "image/svg+xml"
49687
49790
  };
49688
49791
  function resolveContentType(kind, extension, allowSpreadsheets) {
49689
49792
  if (kind === "document") {
@@ -49712,7 +49815,7 @@ function unsupportedFormatMessage(kind, allowSpreadsheets) {
49712
49815
  if (kind === "video") {
49713
49816
  return "Video must be MP4, MOV, WEBM, MPEG, MPG, AVI, FLV, WMV, 3GP, or 3GPP.";
49714
49817
  }
49715
- return "Image must be a PNG, JPEG, or WebP file.";
49818
+ return "Image must be a PNG, JPEG, WebP, or SVG file.";
49716
49819
  }
49717
49820
  __name(unsupportedFormatMessage, "unsupportedFormatMessage");
49718
49821
  function maximumSizeFor(kind) {
@@ -60288,6 +60391,9 @@ function registerInviteCreate(invite) {
60288
60391
  ).option(
60289
60392
  "--process <id>",
60290
60393
  `invite them to this Clarity process instead of the whole team (defaults --role to ${TEAM_ROLE.CLARITY_MEMBER}, the only role a process invitation accepts)`
60394
+ ).option(
60395
+ "--process-role <id>",
60396
+ "configured Process role ID (requires --process)"
60291
60397
  ).option(
60292
60398
  "--send-email",
60293
60399
  "also email the invitation to the recipient. Without it the invitation is created but nobody is notified"
@@ -60308,6 +60414,15 @@ function registerInviteCreate(invite) {
60308
60414
  if (processId !== void 0) {
60309
60415
  body.processId = processId;
60310
60416
  }
60417
+ if (options.processRole !== void 0) {
60418
+ if (!processId) {
60419
+ throw new CliError("--process-role requires --process");
60420
+ }
60421
+ body.process_role_id = trimRequired(
60422
+ options.processRole,
60423
+ "--process-role"
60424
+ );
60425
+ }
60311
60426
  const raw = await httpRequest({
60312
60427
  method: "POST",
60313
60428
  path: buildTeamPath(teamId, "/invites"),
@@ -70513,7 +70628,7 @@ __name(isStandaloneBinary, "isStandaloneBinary");
70513
70628
  import { createRequire } from "node:module";
70514
70629
  function getPackageMeta() {
70515
70630
  if (true) {
70516
- return { name: "@duvoai/cli", version: "1.77.0" };
70631
+ return { name: "@duvoai/cli", version: "1.77.2" };
70517
70632
  }
70518
70633
  const require2 = createRequire(import.meta.url);
70519
70634
  const raw = require2("../../package.json");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duvoai/cli",
3
- "version": "1.77.0",
3
+ "version": "1.77.2",
4
4
  "description": "Command-line interface for the Duvo public API",
5
5
  "bin": {
6
6
  "duvo": "./dist/bin/duvo.js"