@duvoai/cli 1.41.0 → 1.42.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/bin/duvo.js CHANGED
@@ -1663,11 +1663,25 @@ var runMetricsSchema = z10.object({
1663
1663
  cacheWriteTokens: z10.number().int().nonnegative().optional()
1664
1664
  }).optional()
1665
1665
  });
1666
+ var sessionEndSchema = z10.object({
1667
+ endReason: z10.string().optional(),
1668
+ resultSubtype: z10.string().optional(),
1669
+ stopReason: z10.string().nullable().optional(),
1670
+ terminalReason: z10.string().nullable().optional(),
1671
+ isError: z10.boolean().optional(),
1672
+ numTurns: z10.number().optional(),
1673
+ apiDurationMs: z10.number().optional(),
1674
+ messageCount: z10.number().optional(),
1675
+ lastMessageType: z10.string().optional(),
1676
+ pendingToolUseCount: z10.number().optional(),
1677
+ suspectedTruncation: z10.boolean().optional()
1678
+ });
1666
1679
  var duvoSystemSessionCompletedMessageSchema = duvoBaseSystemMessageSchema.and(
1667
1680
  z10.object({
1668
1681
  type: z10.literal("session_completed"),
1669
1682
  phases: sessionPhaseTimingsSchema.optional(),
1670
- runMetrics: runMetricsSchema.optional()
1683
+ runMetrics: runMetricsSchema.optional(),
1684
+ sessionEnd: sessionEndSchema.optional()
1671
1685
  })
1672
1686
  );
1673
1687
  var duvoSystemSessionInterruptedMessageSchema = duvoBaseSystemMessageSchema.and(
@@ -1679,7 +1693,8 @@ var duvoSystemSessionErrorMessageSchema = duvoBaseSystemMessageSchema.and(
1679
1693
  z10.object({
1680
1694
  type: z10.literal("session_error"),
1681
1695
  error: z10.string(),
1682
- runMetrics: runMetricsSchema.optional()
1696
+ runMetrics: runMetricsSchema.optional(),
1697
+ sessionEnd: sessionEndSchema.optional()
1683
1698
  })
1684
1699
  );
1685
1700
  var duvoSystemAgentRunCreatedMessageSchema = duvoBaseSystemMessageSchema.and(
@@ -2086,7 +2101,7 @@ var EVALUATION_RUBRIC_CATALOG = {
2086
2101
  },
2087
2102
  computer_use_interaction_failure: {
2088
2103
  label: "Computer-use interaction failure",
2089
- description: "When the Run required duvo-computer-use or duvo-computer-use-rdp and the desktop was available, did the agent fail because it could not operate the UI effectively? Set to true for repeated missed clicks, typing into the wrong field, failing to use available UI automation/snapshot tools, relying on screenshots when structured desktop tools were more appropriate, stale or missing window/element references, or repeating the same desktop action without progress. Do NOT set true for environment startup, login, or target-system permission issues.",
2104
+ description: "When the Run required duvo-computer-use or duvo-computer-use-rdp and the desktop was available, did the agent fail because it could not operate the UI effectively? Set to true for repeated missed clicks, typing into the wrong field, failing to use available UI automation/snapshot tools, relying on screenshots when structured desktop tools were more appropriate, stale or missing window/element references, or repeating the same desktop action without progress. Do NOT set true for environment startup, login, or target-system permission issues. Do NOT set true for a single expected recovery from the structured-observation gate \u2014 where the agent calls a visual tool (e.g. a screenshot) first, the tool returns a soft error asking for a snapshot, and the agent then takes a snapshot and continues; that is normal one-time self-correction. Only treat screenshot-first behavior as a defect when it recurs after a snapshot is already available or forms a no-progress loop.",
2090
2105
  tooltip: "Duvo had a desktop but could not operate the UI effectively. Flags wrong clicks, wrong fields, and no-progress desktop loops.",
2091
2106
  nullable: true,
2092
2107
  cause: "agent_misbehavior",
@@ -3028,7 +3043,8 @@ var CLARITY_INTERVIEW_LANGUAGES = [
3028
3043
  "hu",
3029
3044
  "pl",
3030
3045
  "pt",
3031
- "pt-BR"
3046
+ "pt-BR",
3047
+ "sk"
3032
3048
  ];
3033
3049
  var clarityInterviewLanguageValueSchema = z16.enum(
3034
3050
  CLARITY_INTERVIEW_LANGUAGES
@@ -3047,7 +3063,8 @@ var CLARITY_LANGUAGE_DISPLAY_NAMES = {
3047
3063
  es: "Spanish (Spain)",
3048
3064
  "es-MX": "Spanish (Mexico)",
3049
3065
  pt: "Portuguese (Portugal)",
3050
- "pt-BR": "Portuguese (Brazil)"
3066
+ "pt-BR": "Portuguese (Brazil)",
3067
+ sk: "Slovak"
3051
3068
  };
3052
3069
  function getClarityLanguageDisplayName(language) {
3053
3070
  return CLARITY_LANGUAGE_DISPLAY_NAMES[language];
@@ -3055,9 +3072,15 @@ function getClarityLanguageDisplayName(language) {
3055
3072
  __name(getClarityLanguageDisplayName, "getClarityLanguageDisplayName");
3056
3073
  __name2(getClarityLanguageDisplayName, "getClarityLanguageDisplayName");
3057
3074
  var MAX_PROCESS_GUIDANCE_PROMPT_CHARS = 5e3;
3058
- function removeControlCharacters(value) {
3075
+ var INSTRUCTIONS_FENCE_START = "[BEGIN INSTRUCTIONS]";
3076
+ var INSTRUCTIONS_FENCE_END = "[END INSTRUCTIONS]";
3077
+ var NEWLINE_CODE_POINT = 10;
3078
+ function removeControlCharacters(value, options = {}) {
3059
3079
  return [...value].map((character) => {
3060
3080
  const codePoint = character.codePointAt(0);
3081
+ if (options.keepNewlines && codePoint === NEWLINE_CODE_POINT) {
3082
+ return character;
3083
+ }
3061
3084
  return codePoint !== void 0 && (codePoint < 32 || codePoint === 127) ? " " : character;
3062
3085
  }).join("");
3063
3086
  }
@@ -3078,7 +3101,52 @@ function formatProcessGuidanceForPrompt(processGuidance) {
3078
3101
  }
3079
3102
  __name(formatProcessGuidanceForPrompt, "formatProcessGuidanceForPrompt");
3080
3103
  __name2(formatProcessGuidanceForPrompt, "formatProcessGuidanceForPrompt");
3104
+ function formatProcessGuidanceAsInstructions(processGuidance) {
3105
+ if (!processGuidance) {
3106
+ return null;
3107
+ }
3108
+ const normalized = removeControlCharacters(
3109
+ processGuidance.replace(/\r\n?/g, "\n"),
3110
+ { keepNewlines: true }
3111
+ ).split("\n").map((line) => line.replace(/[^\S\n]+/g, " ").trim()).join("\n");
3112
+ const withoutFenceTokens = stripInstructionFenceTokens(normalized).split("\n").map((line) => line.replace(/ {2,}/g, " ").trim()).join("\n").replace(/\n{3,}/g, "\n\n").trim();
3113
+ if (!withoutFenceTokens) {
3114
+ return null;
3115
+ }
3116
+ if (withoutFenceTokens.length <= MAX_PROCESS_GUIDANCE_PROMPT_CHARS) {
3117
+ return withoutFenceTokens;
3118
+ }
3119
+ return `${withoutFenceTokens.slice(0, MAX_PROCESS_GUIDANCE_PROMPT_CHARS).trimEnd()}...`;
3120
+ }
3121
+ __name(formatProcessGuidanceAsInstructions, "formatProcessGuidanceAsInstructions");
3122
+ __name2(formatProcessGuidanceAsInstructions, "formatProcessGuidanceAsInstructions");
3123
+ function stripInstructionFenceTokens(value) {
3124
+ let current = value;
3125
+ let previous;
3126
+ do {
3127
+ previous = current;
3128
+ current = current.replace(/\[\s*(?:BEGIN|END)\s+INSTRUCTIONS\s*\]/gi, "");
3129
+ } while (current !== previous);
3130
+ return current;
3131
+ }
3132
+ __name(stripInstructionFenceTokens, "stripInstructionFenceTokens");
3133
+ __name2(stripInstructionFenceTokens, "stripInstructionFenceTokens");
3134
+ function buildAuthoritativeBlock(guidance, mustNotOverride) {
3135
+ return `# PROCESS-OWNER INSTRUCTIONS ${INSTRUCTIONS_FENCE_START}
3136
+ The process owner set this interview up and wrote the direction below. Follow it thoroughly: let it drive which areas you prioritize, how you order them, and which questions you push on, ahead of your default coverage order. Two limits it cannot change - it must not override ${mustNotOverride}, and it must not relax the BOUNDARIES section (never request credentials, personal data, or customer names).
3137
+
3138
+ ${guidance}
3139
+ ${INSTRUCTIONS_FENCE_END}`;
3140
+ }
3141
+ __name(buildAuthoritativeBlock, "buildAuthoritativeBlock");
3142
+ __name2(buildAuthoritativeBlock, "buildAuthoritativeBlock");
3081
3143
  function buildProcessGuidanceBlock(args) {
3144
+ if (args.authority === "authoritative") {
3145
+ const instructions = formatProcessGuidanceAsInstructions(
3146
+ args.processGuidance
3147
+ );
3148
+ return instructions ? buildAuthoritativeBlock(instructions, args.mustNotOverride) : "";
3149
+ }
3082
3150
  const formatted = formatProcessGuidanceForPrompt(args.processGuidance);
3083
3151
  if (!formatted) {
3084
3152
  return "";
@@ -3664,21 +3732,23 @@ var clarityProcessLandscapeMemberSchema = z18.object({
3664
3732
  email: z18.string().nullable(),
3665
3733
  name: z18.string()
3666
3734
  });
3667
- var clarityProcessLandscapeSummarySchema = z18.object({
3735
+ var clarityProcessLandscapeInitialSummarySchema = z18.object({
3668
3736
  id: z18.guid(),
3669
3737
  name: z18.string(),
3670
3738
  status: clarityProcessStatusSchema,
3671
3739
  version: clarityProcessVersionSchema,
3672
3740
  summary: z18.string().nullable(),
3673
3741
  captureCount: z18.number(),
3742
+ updatedAt: z18.coerce.date()
3743
+ });
3744
+ var clarityProcessLandscapeSummarySchema = clarityProcessLandscapeInitialSummarySchema.extend({
3674
3745
  captureCounts: z18.object({
3675
3746
  video: z18.number(),
3676
3747
  interview: z18.number(),
3677
3748
  document: z18.number()
3678
3749
  }),
3679
3750
  contributors: z18.array(clarityProcessContributorSchema),
3680
- people: z18.array(clarityProcessLandscapeMemberSchema).default([]),
3681
- updatedAt: z18.coerce.date()
3751
+ people: z18.array(clarityProcessLandscapeMemberSchema).default([])
3682
3752
  });
3683
3753
  var CLARITY_PROCESS_PRIORITIES = ["high", "medium", "low"];
3684
3754
  var clarityProcessPrioritySchema = z18.enum(CLARITY_PROCESS_PRIORITIES);
@@ -3807,6 +3877,9 @@ var clarityProcessLandscapeFullNodeSchema = z18.object({
3807
3877
  captureRequests: z18.array(clarityLandscapeCaptureRequestSchema).default([]),
3808
3878
  labels: z18.array(clarityProcessAssignedLabelSchema).default([])
3809
3879
  }).strict();
3880
+ var clarityProcessLandscapeInitialFullNodeSchema = clarityProcessLandscapeFullNodeSchema.extend({
3881
+ process: clarityProcessLandscapeInitialSummarySchema.nullable()
3882
+ });
3810
3883
  var clarityProcessLandscapePublicNodeSchema = clarityProcessLandscapeFullNodeSchema.omit({ access: true }).partial({
3811
3884
  teamAssignmentSuggestions: true,
3812
3885
  captureSuggestions: true,
@@ -3827,11 +3900,23 @@ var clarityProcessLandscapeNodeSchema = z18.discriminatedUnion(
3827
3900
  clarityProcessLandscapeRedactedNodeSchema
3828
3901
  ]
3829
3902
  );
3903
+ var clarityProcessLandscapeInitialNodeSchema = z18.discriminatedUnion(
3904
+ "access",
3905
+ [
3906
+ clarityProcessLandscapeInitialFullNodeSchema,
3907
+ clarityProcessLandscapeRedactedNodeSchema
3908
+ ]
3909
+ );
3830
3910
  var clarityProcessLandscapeUnlinkedProcessSchema = clarityProcessLandscapeSummarySchema.extend({
3831
3911
  teamId: z18.guid(),
3832
3912
  teamName: z18.string().nullable(),
3833
3913
  labels: z18.array(clarityProcessAssignedLabelSchema).default([])
3834
3914
  });
3915
+ var clarityProcessLandscapeInitialUnlinkedProcessSchema = clarityProcessLandscapeInitialSummarySchema.extend({
3916
+ teamId: z18.guid(),
3917
+ teamName: z18.string().nullable(),
3918
+ labels: z18.array(clarityProcessAssignedLabelSchema).default([])
3919
+ });
3835
3920
  var clarityProcessLandscapeLinkSchema = z18.object({
3836
3921
  id: z18.guid(),
3837
3922
  sourceNodeId: z18.guid(),
@@ -3895,6 +3980,12 @@ var clarityProcessLandscapeResponseSchema = z18.object({
3895
3980
  ),
3896
3981
  truncated: z18.boolean()
3897
3982
  });
3983
+ var clarityProcessLandscapeInitialResponseSchema = clarityProcessLandscapeResponseSchema.extend({
3984
+ nodes: z18.array(clarityProcessLandscapeInitialNodeSchema),
3985
+ unlinkedProcesses: z18.array(
3986
+ clarityProcessLandscapeInitialUnlinkedProcessSchema
3987
+ )
3988
+ });
3898
3989
  var clarityProcessLandscapePublicResponseSchema = clarityProcessLandscapeResponseSchema.extend({
3899
3990
  nodes: z18.array(clarityProcessLandscapePublicNodeSchema)
3900
3991
  });
@@ -3943,6 +4034,14 @@ var clarityHierarchyPeopleResponseSchema = z18.object({
3943
4034
  people: z18.array(clarityHierarchyPersonSchema),
3944
4035
  truncated: z18.boolean()
3945
4036
  });
4037
+ var clarityLandscapePersonSchema = clarityHierarchyPersonSchema.extend(
4038
+ {
4039
+ nodeId: z18.guid().nullable()
4040
+ }
4041
+ );
4042
+ var clarityLandscapePeopleResponseSchema = clarityHierarchyPeopleResponseSchema.extend({
4043
+ people: z18.array(clarityLandscapePersonSchema)
4044
+ });
3946
4045
  var createClarityProcessPersonRequestSchema = z18.object({
3947
4046
  name: z18.string().max(200).nullable().optional(),
3948
4047
  email: z18.email().nullable().optional(),
@@ -8456,6 +8555,14 @@ var artifactSchema = z36.object({
8456
8555
  // The owning organization for org-owned Pulses; null for team-owned ones
8457
8556
  // (their organization is derived from the team).
8458
8557
  organization_id: z36.guid().nullable(),
8558
+ // The automation this Pulse is a tab of, or null for a free-standing one.
8559
+ // Ownership governs lifecycle (the dashboard is reaped with its automation)
8560
+ // and tab placement, not visibility — an owned Pulse lists like any other, so
8561
+ // this is what lets a client tell the two apart. Optional for the same reason
8562
+ // as `thumbnail_url` below: a published CLI strict-parses this schema, so a
8563
+ // required field would make a new CLI reject every response from a backend
8564
+ // that predates it. The backend always includes it (string or null).
8565
+ automation_id: z36.guid().nullable().optional(),
8459
8566
  created_by_user_id: z36.guid(),
8460
8567
  title: z36.string().nullable(),
8461
8568
  html_code_present: z36.boolean(),
@@ -8833,8 +8940,11 @@ function getProcessLandscapeOnboardingEligibilityKey({
8833
8940
  }
8834
8941
  __name(getProcessLandscapeOnboardingEligibilityKey, "getProcessLandscapeOnboardingEligibilityKey");
8835
8942
  __name2(getProcessLandscapeOnboardingEligibilityKey, "getProcessLandscapeOnboardingEligibilityKey");
8943
+ var LANDSCAPE_ONBOARDING_GOAL_KEYS = LANDSCAPE_ONBOARDING_GOALS.map(
8944
+ (goal) => goal.key
8945
+ );
8836
8946
  var landscapeOnboardingGoalKeySchema = z40.enum(
8837
- LANDSCAPE_ONBOARDING_GOALS.map((goal) => goal.key)
8947
+ LANDSCAPE_ONBOARDING_GOAL_KEYS
8838
8948
  );
8839
8949
  var landscapeOnboardingGoalSchema = z40.object({
8840
8950
  key: landscapeOnboardingGoalKeySchema,
@@ -8848,12 +8958,41 @@ var landscapeOnboardingHandoffRequestSchema = z40.object({
8848
8958
  // can still finish after the backend deploys. New clients always send it.
8849
8959
  businessArea: z40.string().trim().min(2).max(160).optional(),
8850
8960
  answers: landscapeOnboardingAnswersSchema.optional(),
8851
- goal: landscapeOnboardingGoalSchema
8961
+ goal: landscapeOnboardingGoalSchema,
8962
+ /**
8963
+ * The primed chat the prewarm returned, if any. Advisory: the server
8964
+ * re-validates ownership, preset, and state before adopting it, and any
8965
+ * mismatch silently falls back to a fresh chat.
8966
+ */
8967
+ primedChatId: z40.guid().optional()
8852
8968
  });
8969
+ var landscapeOnboardingScaffoldStatusSchema = z40.enum([
8970
+ "created",
8971
+ "existing"
8972
+ ]);
8853
8973
  var landscapeOnboardingHandoffResponseSchema = z40.object({
8854
8974
  chatId: z40.guid(),
8855
8975
  /** The chat's team, so the client can open the rail on it directly. */
8856
- teamId: z40.guid()
8976
+ teamId: z40.guid(),
8977
+ scaffoldStatus: landscapeOnboardingScaffoldStatusSchema,
8978
+ /** Null when an existing landscape prevented template application. */
8979
+ businessType: z40.enum(["generic", "retail"]).nullable(),
8980
+ /** Null when an existing landscape prevented template application. */
8981
+ template: z40.object({
8982
+ id: z40.string(),
8983
+ version: z40.number().int().positive()
8984
+ }).nullable(),
8985
+ /**
8986
+ * The full landscape snapshot — the same shape `GET .../clarity/hierarchy/landscape`
8987
+ * returns — so the frontend seeds its query cache without a follow-up read.
8988
+ */
8989
+ landscape: clarityProcessLandscapeResponseSchema,
8990
+ assistantStatus: z40.literal("starting")
8991
+ });
8992
+ var landscapeOnboardingPrewarmResponseSchema = z40.object({
8993
+ status: z40.literal("warming"),
8994
+ chatId: z40.guid().optional(),
8995
+ teamId: z40.guid().optional()
8857
8996
  });
8858
8997
  var logoUploadUrlBodySchema = z41.object({
8859
8998
  fileName: z41.string().min(1),
@@ -9928,6 +10067,9 @@ var adminTeamClarityStorageGetResponseSchema = z49.object({
9928
10067
  var adminTeamClarityStorageActivateResponseSchema = z49.object({
9929
10068
  storage: adminTeamClarityStorageDedicatedConfigSchema
9930
10069
  });
10070
+ var adminTeamClarityStorageDeactivateResponseSchema = z49.object({
10071
+ storage: adminTeamClarityStorageSharedConfigSchema
10072
+ });
9931
10073
  var McpToolApprovalFilterSchema = z50.object({
9932
10074
  always: z50.object({
9933
10075
  tool_names: z50.array(z50.string()).nullable().optional()
@@ -10385,7 +10527,13 @@ var activeRunCountByAgentApiSchema = z51.object({
10385
10527
  id: z51.string(),
10386
10528
  name: z51.string()
10387
10529
  }),
10388
- run_count: z51.int()
10530
+ run_count: z51.int(),
10531
+ /**
10532
+ * The run's id when the group holds exactly one run, null otherwise. Only a
10533
+ * lone run identifies itself unambiguously, so a caller that wants to link
10534
+ * into *the* run (rather than into the agent's run list) gates on this.
10535
+ */
10536
+ sole_run_id: z51.string().nullable()
10389
10537
  });
10390
10538
  var activeRunsListApiSchema = z51.array(activeRunCountByAgentApiSchema);
10391
10539
  var buildIntegrationConfigSchema = z51.object({
@@ -10728,10 +10876,43 @@ var automationRevisionQueueBindingApiSchema = z59.object({
10728
10876
  description: z59.string().nullable().describe("Per-revision queue description override")
10729
10877
  });
10730
10878
  var automationRevisionTriggerBindingApiSchema = z59.object({
10731
- trigger_id: z59.guid().describe("Stable trigger identity"),
10879
+ automation_trigger_id: z59.guid().describe("Stable, credential-free trigger declaration identity"),
10880
+ agent_id: z59.guid().describe("Agent this trigger routes to"),
10881
+ integration_slug: z59.string().describe("Integration the declaration watches, e.g. `gmail`"),
10882
+ trigger_type: z59.string().describe("Trigger type within the integration, e.g. `new_email`"),
10732
10883
  enabled: z59.boolean().describe("Whether the trigger is enabled in this revision"),
10733
10884
  filter_config: z59.record(z59.string(), z59.unknown()).describe("Per-revision trigger filter configuration")
10734
10885
  });
10886
+ var AUTOMATION_SCHEDULE_FREQUENCIES = [
10887
+ "hourly",
10888
+ "daily",
10889
+ "workday",
10890
+ "weekly",
10891
+ "monthly"
10892
+ ];
10893
+ var AUTOMATION_SCHEDULE_DAYS = [
10894
+ "monday",
10895
+ "tuesday",
10896
+ "wednesday",
10897
+ "thursday",
10898
+ "friday",
10899
+ "saturday",
10900
+ "sunday"
10901
+ ];
10902
+ var automationRevisionScheduleBindingApiSchema = z59.object({
10903
+ automation_schedule_id: z59.guid().describe("Stable, credential-free schedule declaration identity"),
10904
+ agent_id: z59.guid().describe("Agent this schedule fires"),
10905
+ enabled: z59.boolean().describe("Whether the schedule is enabled in this revision"),
10906
+ cron: z59.string().nullable().describe(
10907
+ "5-field cron expression; when set, the frequency form is unused"
10908
+ ),
10909
+ frequency: z59.enum(AUTOMATION_SCHEDULE_FREQUENCIES).nullable().describe("Frequency form, used when `cron` is null"),
10910
+ time: z59.string().nullable().describe("Local time of day as HH:MM, for the frequency form"),
10911
+ timezone: z59.string().describe("IANA timezone the schedule is evaluated in"),
10912
+ day: z59.enum(AUTOMATION_SCHEDULE_DAYS).nullable().describe("Day of week for a weekly schedule"),
10913
+ day_of_month: z59.int().min(1).max(31).nullable().describe("Day of month for a monthly schedule"),
10914
+ task: z59.string().nullable().describe("Prompt passed as the run's initial user message")
10915
+ });
10735
10916
  var automationRevisionDetailApiSchema = automationRevisionSummaryApiSchema.extend({
10736
10917
  ai_description: z59.string().nullable().describe(
10737
10918
  "AI-generated short description of what this revision does (null until generated)"
@@ -10744,7 +10925,8 @@ var automationRevisionDetailApiSchema = automationRevisionSummaryApiSchema.exten
10744
10925
  ),
10745
10926
  agents: z59.array(automationRevisionAgentBindingApiSchema).describe("Agent bindings in the revision"),
10746
10927
  queues: z59.array(automationRevisionQueueBindingApiSchema).describe("Queue routing bindings in the revision"),
10747
- triggers: z59.array(automationRevisionTriggerBindingApiSchema).describe("Trigger config bindings in the revision")
10928
+ triggers: z59.array(automationRevisionTriggerBindingApiSchema).describe("Trigger config bindings in the revision"),
10929
+ schedules: z59.array(automationRevisionScheduleBindingApiSchema).describe("Recurring schedule config bindings in the revision")
10748
10930
  });
10749
10931
  var automationRevisionDetailResponseApiSchema = z59.object({
10750
10932
  revision: automationRevisionDetailApiSchema.describe(
@@ -11902,6 +12084,11 @@ var FEATURE_FLAG_CATALOGUE = {
11902
12084
  defaultValue: false,
11903
12085
  description: "Enables the hidden guided company-research and business-outcome onboarding prototype before the organization Process Landscape. Off by default for internal testing."
11904
12086
  },
12087
+ LANDSCAPE_ONBOARDING_PRIMED_SESSION: {
12088
+ key: "landscape_onboarding_primed_session",
12089
+ defaultValue: false,
12090
+ description: "Pre-starts the landscape onboarding Ask Duvo session at profile confirm (chat + hidden primer turn in the prewarmed sandbox), so the goal-click handoff resumes a warm session instead of cold-starting one. Requires landscape_onboarding. Off by default for staged rollout."
12091
+ },
11905
12092
  UNIFIED_SIGNUP_BOOTSTRAP: {
11906
12093
  key: "unified_signup_bootstrap",
11907
12094
  defaultValue: false,
@@ -11912,6 +12099,11 @@ var FEATURE_FLAG_CATALOGUE = {
11912
12099
  defaultValue: false,
11913
12100
  description: "Enables the Clarity meeting notetaker (Recall.ai bot). When disabled, the 'Meeting Notetaker' option is hidden in the Add Content menu and the POST /clarity/processes/:id/captures/meeting invite route returns 404; the Recall webhook callback is unaffected. Off-by-default for staged rollout."
11914
12101
  },
12102
+ CLARITY_PROCESS_GUIDANCE_AUTHORITATIVE: {
12103
+ key: "clarity_process_guidance_authoritative",
12104
+ defaultValue: false,
12105
+ description: "Makes the Clarity interview agent follow the process owner's guidance thoroughly instead of treating it as low-priority context it must not act on. When on, the guidance is rendered as owner direction for how to run the interview - which areas to prioritize, how to order them, which questions to push on. It still cannot override what the interviewee says or what the screen shows, and it cannot relax the interview BOUNDARIES (never request credentials, personal data, or customer names). Affects the live voice/screenshare interview prompt only; the current-process and transformation-proposal generation pipelines keep the soft-steer framing. Off-by-default for staged rollout."
12106
+ },
11915
12107
  CLARITY_REALTIME_SDP_PROXY: {
11916
12108
  key: "clarity_realtime_sdp_proxy",
11917
12109
  defaultValue: false,
@@ -11967,11 +12159,6 @@ var FEATURE_FLAG_CATALOGUE = {
11967
12159
  defaultValue: false,
11968
12160
  description: "Enables the Move Agent to another team flow. Default-off while we monitor multi-table move semantics in prod; flip on for individual teams to grant access."
11969
12161
  },
11970
- CROSS_TEAM_PULSE_MOVE: {
11971
- key: "cross_team_pulse_move",
11972
- defaultValue: false,
11973
- description: "Enables the Move Pulse dashboard to another team flow. Moving a dashboard reassigns its ownership to the mover, resets it to private, and reconnects or drops its attached Connections against the target team. Default-off while we monitor move semantics in prod; flip on for individual teams to grant access."
11974
- },
11975
12162
  TEAM_ONTOLOGY: {
11976
12163
  key: "team_ontology",
11977
12164
  defaultValue: false,
@@ -30335,7 +30522,10 @@ var MOVE_REQUEST_TIMEOUT_MS = 12e4;
30335
30522
  function registerPulseMove(pulse) {
30336
30523
  pulse.command("move <id>").description(
30337
30524
  "Move a Pulse dashboard to another team. Only the latest version moves \u2014 chat, raw events, older versions, and member shares are deleted; you become the owner, visibility resets to private, and the dashboard's API key is rotated. Requires Manager or above on both teams."
30338
- ).requiredOption("--to <team-id>", "destination team ID").option(
30525
+ ).requiredOption(
30526
+ "--to <team-id>",
30527
+ "destination team ID \u2014 any team where you're a Manager or above"
30528
+ ).option(
30339
30529
  "--team <id>",
30340
30530
  "source team ID (defaults to the team scoped to your credentials)"
30341
30531
  ).option(
@@ -33700,13 +33890,25 @@ function registerSkillsDownload(skills) {
33700
33890
  }
33701
33891
  __name(registerSkillsDownload, "registerSkillsDownload");
33702
33892
 
33893
+ // src/commands/skills/encode-file-path.ts
33894
+ function encodeFilePath(filePath) {
33895
+ const segments = filePath.split("/");
33896
+ if (segments.some((segment) => segment === "." || segment === "..")) {
33897
+ throw new CliError(
33898
+ `Invalid file path "${filePath}": paths inside a skill can't contain "." or ".." segments.`
33899
+ );
33900
+ }
33901
+ return segments.map((segment) => encodeURIComponent(segment)).join("/");
33902
+ }
33903
+ __name(encodeFilePath, "encodeFilePath");
33904
+
33703
33905
  // src/commands/skills/file-get.ts
33704
33906
  function registerSkillsFileGet(skills) {
33705
33907
  skills.command("file-get <skill-id> <path>").description(
33706
33908
  "Get the content of a file in a skill (path is the relative file path inside the skill, e.g. SKILL.md)"
33707
33909
  ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function fileGetAction(skillId, filePath, options) {
33708
33910
  const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
33709
- const encodedPath = filePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
33911
+ const encodedPath = encodeFilePath(filePath);
33710
33912
  const raw = await httpRequest({
33711
33913
  method: "GET",
33712
33914
  path: `/v2/skills/${encodeURIComponent(skillId)}/files/${encodedPath}`,
@@ -33728,8 +33930,26 @@ function registerSkillsFileGet(skills) {
33728
33930
  }
33729
33931
  __name(registerSkillsFileGet, "registerSkillsFileGet");
33730
33932
 
33731
- // src/commands/skills/file-update.ts
33933
+ // src/commands/skills/read-content-option.ts
33732
33934
  import { readFileSync as readFileSync6 } from "node:fs";
33935
+ function readContentOption(options) {
33936
+ if (options.content !== void 0) {
33937
+ return options.content;
33938
+ }
33939
+ if (options.contentFile === void 0) {
33940
+ throw new CliError("Pass either --content or --content-file");
33941
+ }
33942
+ try {
33943
+ return options.contentFile === "-" ? readFileSync6(0, "utf8") : readFileSync6(options.contentFile, "utf8");
33944
+ } catch (error) {
33945
+ const reason = error instanceof Error ? error.message : String(error);
33946
+ const source = options.contentFile === "-" ? "stdin" : options.contentFile;
33947
+ throw new CliError(`Cannot read --content-file ${source}: ${reason}`);
33948
+ }
33949
+ }
33950
+ __name(readContentOption, "readContentOption");
33951
+
33952
+ // src/commands/skills/file-update.ts
33733
33953
  function registerSkillsFileUpdate(skills) {
33734
33954
  skills.command("file-update <skill-id> <path>").description(
33735
33955
  "Update the content of a file in a skill (path is the relative file path inside the skill)"
@@ -33742,9 +33962,9 @@ function registerSkillsFileUpdate(skills) {
33742
33962
  "Pass either --content or --content-file, not both."
33743
33963
  );
33744
33964
  }
33745
- const content = readContent2(options);
33965
+ const content = readContentOption(options);
33746
33966
  const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
33747
- const encodedPath = filePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
33967
+ const encodedPath = encodeFilePath(filePath);
33748
33968
  const raw = await httpRequest({
33749
33969
  method: "PUT",
33750
33970
  path: `/v2/skills/${encodeURIComponent(skillId)}/files/${encodedPath}`,
@@ -33772,25 +33992,6 @@ function registerSkillsFileUpdate(skills) {
33772
33992
  }, "fileUpdateAction"));
33773
33993
  }
33774
33994
  __name(registerSkillsFileUpdate, "registerSkillsFileUpdate");
33775
- function readContent2(options) {
33776
- if (options.content !== void 0) {
33777
- return options.content;
33778
- }
33779
- if (options.contentFile === void 0) {
33780
- throw new CliError("Pass either --content or --content-file");
33781
- }
33782
- if (options.contentFile === "-") {
33783
- return readFileSync6(0, "utf8");
33784
- }
33785
- try {
33786
- return readFileSync6(options.contentFile, "utf8");
33787
- } catch (error) {
33788
- throw new CliError(
33789
- `Cannot read --content-file ${options.contentFile}: ${error.message}`
33790
- );
33791
- }
33792
- }
33793
- __name(readContent2, "readContent");
33794
33995
 
33795
33996
  // src/commands/skills/files.ts
33796
33997
  var TABLE_COLUMNS43 = [
@@ -34043,6 +34244,482 @@ function registerSkillsList(skills) {
34043
34244
  }
34044
34245
  __name(registerSkillsList, "registerSkillsList");
34045
34246
 
34247
+ // src/api/skill-revision-schemas.ts
34248
+ import { z as z125 } from "zod";
34249
+ var skillRevisionSchema = z125.object({
34250
+ id: z125.string(),
34251
+ skill_id: z125.string(),
34252
+ revision_number: z125.number().nullable(),
34253
+ status: z125.enum(["draft", "live", "historic"]),
34254
+ revision_name: z125.string().nullable(),
34255
+ revision_description: z125.string().nullable(),
34256
+ created_by: z125.string().nullable(),
34257
+ created_by_name: z125.string().nullable(),
34258
+ created_at: z125.string(),
34259
+ updated_at: z125.string()
34260
+ });
34261
+ var listSkillRevisionsResponseSchema = z125.object({
34262
+ revisions: z125.array(skillRevisionSchema),
34263
+ total: z125.number().nullish(),
34264
+ limit: z125.number().nullish(),
34265
+ offset: z125.number().nullish()
34266
+ });
34267
+ var createSkillRevisionResponseSchema = z125.object({
34268
+ revision: skillRevisionSchema,
34269
+ created: z125.boolean()
34270
+ });
34271
+ var skillRevisionResponseSchema = z125.object({
34272
+ revision: skillRevisionSchema
34273
+ });
34274
+ var deleteSkillRevisionResponseSchema = z125.object({
34275
+ success: z125.boolean(),
34276
+ message: z125.string()
34277
+ });
34278
+ var skillRevisionFileSchema = z125.object({
34279
+ name: z125.string(),
34280
+ path: z125.string(),
34281
+ size: z125.number().optional(),
34282
+ contentType: z125.string().optional(),
34283
+ updatedAt: z125.string().optional()
34284
+ });
34285
+ var listSkillRevisionFilesResponseSchema = z125.object({
34286
+ files: z125.array(skillRevisionFileSchema),
34287
+ limit: z125.number().nullish(),
34288
+ has_more: z125.boolean().nullish(),
34289
+ next_cursor: z125.string().nullish()
34290
+ });
34291
+
34292
+ // src/commands/skills/revisions/create.ts
34293
+ function registerSkillsRevisionsCreate(revisions) {
34294
+ revisions.command("create <skill-id>").description(
34295
+ "Open a draft revision of a skill. Edits to the draft leave the active version untouched until you run `revisions promote`. A skill has at most one open draft, so this resumes an existing one."
34296
+ ).option(
34297
+ "--from <revision-id>",
34298
+ "revision to copy the draft's files from (default: the active revision)"
34299
+ ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function createAction(skillId, options) {
34300
+ const id = trimRequired(skillId, "<skill-id>");
34301
+ const body = {};
34302
+ if (options.from !== void 0) {
34303
+ body.source_revision_id = trimRequired(options.from, "--from");
34304
+ }
34305
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34306
+ const raw = await httpRequest({
34307
+ method: "POST",
34308
+ path: `/v2/skills/${encodeURIComponent(id)}/revisions`,
34309
+ apiKey,
34310
+ apiBaseUrl,
34311
+ body
34312
+ });
34313
+ if (options.json) {
34314
+ printJson(raw);
34315
+ return;
34316
+ }
34317
+ const parsed = createSkillRevisionResponseSchema.safeParse(raw);
34318
+ if (!parsed.success) {
34319
+ throw new CliError(
34320
+ `Unexpected response from the API: ${parsed.error.message}`
34321
+ );
34322
+ }
34323
+ const { revision, created } = parsed.data;
34324
+ console.log(
34325
+ green(created ? "Draft revision created!" : "Resumed the open draft.")
34326
+ );
34327
+ console.log(
34328
+ renderKeyValue([
34329
+ { label: "ID", value: revision.id },
34330
+ { label: "Skill", value: revision.skill_id },
34331
+ { label: "Status", value: revision.status },
34332
+ { label: "Created", value: revision.created_at }
34333
+ ])
34334
+ );
34335
+ }, "createAction"));
34336
+ }
34337
+ __name(registerSkillsRevisionsCreate, "registerSkillsRevisionsCreate");
34338
+
34339
+ // src/commands/skills/revisions/delete.ts
34340
+ function registerSkillsRevisionsDelete(revisions) {
34341
+ revisions.command("delete <revision-id>").description(
34342
+ "Delete a draft or historic revision and its files. The active revision can't be deleted \u2014 promote another one first."
34343
+ ).option("-y, --yes", "skip the confirmation prompt").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function deleteAction(revisionId, options) {
34344
+ const id = trimRequired(revisionId, "<revision-id>");
34345
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34346
+ await confirmDestructive({
34347
+ message: `Delete revision "${id}"?`,
34348
+ skip: options.yes ?? false
34349
+ });
34350
+ const raw = await httpRequest({
34351
+ method: "DELETE",
34352
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}`,
34353
+ apiKey,
34354
+ apiBaseUrl
34355
+ });
34356
+ if (options.json) {
34357
+ printJson(raw);
34358
+ return;
34359
+ }
34360
+ const parsed = deleteSkillRevisionResponseSchema.safeParse(raw);
34361
+ if (!parsed.success) {
34362
+ throw new CliError(
34363
+ `Unexpected response from the API: ${parsed.error.message}`
34364
+ );
34365
+ }
34366
+ if (!parsed.data.success) {
34367
+ throw new CliError(
34368
+ `Failed to delete revision "${id}": ${parsed.data.message}`
34369
+ );
34370
+ }
34371
+ console.log(green(`Revision "${id}" deleted.`));
34372
+ }, "deleteAction"));
34373
+ }
34374
+ __name(registerSkillsRevisionsDelete, "registerSkillsRevisionsDelete");
34375
+
34376
+ // src/commands/skills/revisions/file-get.ts
34377
+ function registerSkillsRevisionsFileGet(revisions) {
34378
+ revisions.command("file-get <revision-id> <path>").description(
34379
+ "Get the content of a file in a skill revision (path is the relative file path inside the revision, e.g. SKILL.md)"
34380
+ ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function fileGetAction(revisionId, filePath, options) {
34381
+ const id = trimRequired(revisionId, "<revision-id>");
34382
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34383
+ const raw = await httpRequest({
34384
+ method: "GET",
34385
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}/files/${encodeFilePath(filePath)}`,
34386
+ apiKey,
34387
+ apiBaseUrl
34388
+ });
34389
+ if (options.json) {
34390
+ printJson(raw);
34391
+ return;
34392
+ }
34393
+ const parsed = getSkillFileContentResponseSchema.safeParse(raw);
34394
+ if (!parsed.success) {
34395
+ throw new CliError(
34396
+ `Unexpected response from the API: ${parsed.error.message}`
34397
+ );
34398
+ }
34399
+ process.stdout.write(parsed.data.content);
34400
+ }, "fileGetAction"));
34401
+ }
34402
+ __name(registerSkillsRevisionsFileGet, "registerSkillsRevisionsFileGet");
34403
+
34404
+ // src/commands/skills/revisions/file-update.ts
34405
+ function registerSkillsRevisionsFileUpdate(revisions) {
34406
+ revisions.command("file-update <revision-id> <path>").description(
34407
+ "Write a file into a skill revision (path is the relative file path inside the revision). Writing into a draft leaves the active version untouched until you promote it."
34408
+ ).option("--content <text>", "new file content as a string").option(
34409
+ "--content-file <path>",
34410
+ 'path to a file to read content from, or "-" for stdin'
34411
+ ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function fileUpdateAction(revisionId, filePath, options) {
34412
+ if (options.content !== void 0 && options.contentFile !== void 0) {
34413
+ throw new CliError(
34414
+ "Pass either --content or --content-file, not both."
34415
+ );
34416
+ }
34417
+ const id = trimRequired(revisionId, "<revision-id>");
34418
+ const content = readContentOption(options);
34419
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34420
+ const raw = await httpRequest({
34421
+ method: "PUT",
34422
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}/files/${encodeFilePath(filePath)}`,
34423
+ apiKey,
34424
+ apiBaseUrl,
34425
+ body: { content }
34426
+ });
34427
+ if (options.json) {
34428
+ printJson(raw);
34429
+ return;
34430
+ }
34431
+ const parsed = updateSkillFileResponseSchema.safeParse(raw);
34432
+ if (!parsed.success) {
34433
+ throw new CliError(
34434
+ `Unexpected response from the API: ${parsed.error.message}`
34435
+ );
34436
+ }
34437
+ if (!parsed.data.success) {
34438
+ throw new CliError(`Failed to update file: ${parsed.data.message}`);
34439
+ }
34440
+ console.log(green("File updated!"));
34441
+ if (parsed.data.message) {
34442
+ console.log(parsed.data.message);
34443
+ }
34444
+ }, "fileUpdateAction"));
34445
+ }
34446
+ __name(registerSkillsRevisionsFileUpdate, "registerSkillsRevisionsFileUpdate");
34447
+
34448
+ // src/commands/skills/revisions/files.ts
34449
+ var DEFAULT_LIMIT16 = 100;
34450
+ var MIN_LIMIT18 = 1;
34451
+ var MAX_LIMIT16 = 1e3;
34452
+ var TABLE_COLUMNS44 = [
34453
+ { header: "PATH", cell: /* @__PURE__ */ __name((row) => row.path, "cell") },
34454
+ { header: "NAME", cell: /* @__PURE__ */ __name((row) => row.name, "cell") },
34455
+ {
34456
+ header: "SIZE",
34457
+ cell: /* @__PURE__ */ __name((row) => row.size === void 0 ? "" : String(row.size), "cell")
34458
+ },
34459
+ {
34460
+ header: "CONTENT TYPE",
34461
+ cell: /* @__PURE__ */ __name((row) => row.contentType ?? "", "cell")
34462
+ },
34463
+ {
34464
+ header: "UPDATED",
34465
+ cell: /* @__PURE__ */ __name((row) => row.updatedAt ?? "", "cell")
34466
+ }
34467
+ ];
34468
+ function registerSkillsRevisionsFiles(revisions) {
34469
+ revisions.command("files <revision-id>").description("List files in a skill revision").option("--limit <n>", `page size (${MIN_LIMIT18}-${MAX_LIMIT16})`).option(
34470
+ "--cursor <token>",
34471
+ "continuation token from a previous page's next_cursor"
34472
+ ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function filesAction(revisionId, options) {
34473
+ const id = trimRequired(revisionId, "<revision-id>");
34474
+ const limit = parseLimit(options.limit, {
34475
+ defaultValue: DEFAULT_LIMIT16,
34476
+ min: MIN_LIMIT18,
34477
+ max: MAX_LIMIT16
34478
+ });
34479
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34480
+ const searchParams = new URLSearchParams();
34481
+ searchParams.append("limit", String(limit));
34482
+ if (options.cursor !== void 0) {
34483
+ searchParams.append("cursor", trimRequired(options.cursor, "--cursor"));
34484
+ }
34485
+ const raw = await httpRequest({
34486
+ method: "GET",
34487
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}/files`,
34488
+ apiKey,
34489
+ apiBaseUrl,
34490
+ searchParams
34491
+ });
34492
+ if (options.json) {
34493
+ printJson(raw);
34494
+ return;
34495
+ }
34496
+ const parsed = listSkillRevisionFilesResponseSchema.safeParse(raw);
34497
+ if (!parsed.success) {
34498
+ throw new CliError(
34499
+ `Unexpected response from the API: ${parsed.error.message}`
34500
+ );
34501
+ }
34502
+ if (parsed.data.has_more === true && (parsed.data.next_cursor === null || parsed.data.next_cursor === void 0)) {
34503
+ throw new CliError(
34504
+ "The API reported more files but returned no next_cursor; cannot page further."
34505
+ );
34506
+ }
34507
+ const nextCursor = parsed.data.has_more === true ? parsed.data.next_cursor ?? null : null;
34508
+ if (parsed.data.files.length === 0) {
34509
+ console.log(
34510
+ nextCursor === null ? "No files found." : `No files on this page \u2014 next page: --cursor ${nextCursor}`
34511
+ );
34512
+ return;
34513
+ }
34514
+ console.log(renderTable(TABLE_COLUMNS44, parsed.data.files));
34515
+ console.log(
34516
+ nextCursor === null ? `Showing ${parsed.data.files.length}` : `Showing ${parsed.data.files.length} \xB7 more files remain \u2014 next page: --cursor ${nextCursor}`
34517
+ );
34518
+ }, "filesAction"));
34519
+ }
34520
+ __name(registerSkillsRevisionsFiles, "registerSkillsRevisionsFiles");
34521
+
34522
+ // src/commands/skills/revisions/list.ts
34523
+ var DEFAULT_LIMIT17 = 20;
34524
+ var MIN_LIMIT19 = 1;
34525
+ var MAX_LIMIT17 = 100;
34526
+ var TABLE_COLUMNS45 = [
34527
+ { header: "ID", cell: /* @__PURE__ */ __name((row) => row.id, "cell") },
34528
+ {
34529
+ header: "VERSION",
34530
+ cell: /* @__PURE__ */ __name((row) => String(row.revision_number ?? ""), "cell")
34531
+ },
34532
+ { header: "STATUS", cell: /* @__PURE__ */ __name((row) => row.status, "cell") },
34533
+ { header: "NAME", cell: /* @__PURE__ */ __name((row) => row.revision_name ?? "", "cell") },
34534
+ {
34535
+ header: "CREATED BY",
34536
+ cell: /* @__PURE__ */ __name((row) => row.created_by_name ?? "", "cell")
34537
+ },
34538
+ { header: "CREATED", cell: /* @__PURE__ */ __name((row) => row.created_at, "cell") }
34539
+ ];
34540
+ function registerSkillsRevisionsList(revisions) {
34541
+ revisions.command("list <skill-id>", { isDefault: true }).description("List a skill's version history").option("--limit <n>", `page size (${MIN_LIMIT19}-${MAX_LIMIT17})`).option("--offset <n>", "number of revisions to skip").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function listAction(skillId, options) {
34542
+ const id = trimRequired(skillId, "<skill-id>");
34543
+ const limit = parseLimit(options.limit, {
34544
+ defaultValue: DEFAULT_LIMIT17,
34545
+ min: MIN_LIMIT19,
34546
+ max: MAX_LIMIT17
34547
+ });
34548
+ const offset = parseOffset(options.offset);
34549
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34550
+ const searchParams = new URLSearchParams();
34551
+ searchParams.append("limit", String(limit));
34552
+ searchParams.append("offset", String(offset));
34553
+ const raw = await httpRequest({
34554
+ method: "GET",
34555
+ path: `/v2/skills/${encodeURIComponent(id)}/revisions`,
34556
+ apiKey,
34557
+ apiBaseUrl,
34558
+ searchParams
34559
+ });
34560
+ if (options.json) {
34561
+ printJson(raw);
34562
+ return;
34563
+ }
34564
+ const parsed = listSkillRevisionsResponseSchema.safeParse(raw);
34565
+ if (!parsed.success) {
34566
+ throw new CliError(
34567
+ `Unexpected response from the API: ${parsed.error.message}`
34568
+ );
34569
+ }
34570
+ const response = parsed.data;
34571
+ if (response.revisions.length === 0) {
34572
+ console.log("No revisions found.");
34573
+ return;
34574
+ }
34575
+ console.log(renderTable(TABLE_COLUMNS45, response.revisions));
34576
+ const resolvedOffset = response.offset ?? offset;
34577
+ const total = response.total ?? null;
34578
+ const summary = total === null ? `Showing ${response.revisions.length} \xB7 offset ${resolvedOffset}` : `Showing ${response.revisions.length} of ${total} \xB7 offset ${resolvedOffset}`;
34579
+ console.log(summary);
34580
+ }, "listAction"));
34581
+ }
34582
+ __name(registerSkillsRevisionsList, "registerSkillsRevisionsList");
34583
+
34584
+ // src/commands/skills/revisions/promote.ts
34585
+ function registerSkillsRevisionsPromote(revisions) {
34586
+ revisions.command("promote <revision-id>").description(
34587
+ "Make a revision the active version of its skill. The previously active version becomes historic and can be re-activated later."
34588
+ ).option(
34589
+ "--name <text>",
34590
+ "display name to set on the promoted revision (1-80 chars)"
34591
+ ).option("--description <text>", "description for the promoted revision").option(
34592
+ "--clear-description",
34593
+ "remove the revision's description while promoting it"
34594
+ ).option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function promoteAction(revisionId, options) {
34595
+ if (options.description !== void 0 && options.clearDescription === true) {
34596
+ throw new CliError(
34597
+ "Pass either --description or --clear-description, not both."
34598
+ );
34599
+ }
34600
+ const id = trimRequired(revisionId, "<revision-id>");
34601
+ const body = {};
34602
+ if (options.name !== void 0) {
34603
+ body.revision_name = trimRequired(options.name, "--name");
34604
+ }
34605
+ if (options.description !== void 0) {
34606
+ body.revision_description = options.description;
34607
+ } else if (options.clearDescription === true) {
34608
+ body.revision_description = null;
34609
+ }
34610
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34611
+ const raw = await httpRequest({
34612
+ method: "POST",
34613
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}/promote`,
34614
+ apiKey,
34615
+ apiBaseUrl,
34616
+ body
34617
+ });
34618
+ if (options.json) {
34619
+ printJson(raw);
34620
+ return;
34621
+ }
34622
+ const parsed = skillRevisionResponseSchema.safeParse(raw);
34623
+ if (!parsed.success) {
34624
+ throw new CliError(
34625
+ `Unexpected response from the API: ${parsed.error.message}`
34626
+ );
34627
+ }
34628
+ const { revision } = parsed.data;
34629
+ console.log(green(`Revision "${id}" is now active!`));
34630
+ console.log(
34631
+ renderKeyValue([
34632
+ { label: "Skill", value: revision.skill_id },
34633
+ { label: "Version", value: String(revision.revision_number ?? "") },
34634
+ { label: "Name", value: revision.revision_name ?? "" },
34635
+ { label: "Status", value: revision.status }
34636
+ ])
34637
+ );
34638
+ }, "promoteAction"));
34639
+ }
34640
+ __name(registerSkillsRevisionsPromote, "registerSkillsRevisionsPromote");
34641
+
34642
+ // src/commands/skills/revisions/update.ts
34643
+ function registerSkillsRevisionsUpdate(revisions) {
34644
+ revisions.command("update <revision-id>").description("Rename a revision or change its description").option("--name <text>", "new display name for the revision (1-80 chars)").option("--clear-name", "remove the revision's display name").option("--description <text>", "new description for the revision").option("--clear-description", "remove the revision's description").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function updateAction(revisionId, options) {
34645
+ const id = trimRequired(revisionId, "<revision-id>");
34646
+ const body = buildUpdateBody3(options);
34647
+ const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
34648
+ const raw = await httpRequest({
34649
+ method: "PATCH",
34650
+ path: `/v2/skill-revisions/${encodeURIComponent(id)}`,
34651
+ apiKey,
34652
+ apiBaseUrl,
34653
+ body
34654
+ });
34655
+ if (options.json) {
34656
+ printJson(raw);
34657
+ return;
34658
+ }
34659
+ const parsed = skillRevisionResponseSchema.safeParse(raw);
34660
+ if (!parsed.success) {
34661
+ throw new CliError(
34662
+ `Unexpected response from the API: ${parsed.error.message}`
34663
+ );
34664
+ }
34665
+ const { revision } = parsed.data;
34666
+ console.log(green("Revision updated!"));
34667
+ console.log(
34668
+ renderKeyValue([
34669
+ { label: "ID", value: revision.id },
34670
+ { label: "Name", value: revision.revision_name ?? "" },
34671
+ { label: "Description", value: revision.revision_description ?? "" },
34672
+ { label: "Status", value: revision.status }
34673
+ ])
34674
+ );
34675
+ }, "updateAction"));
34676
+ }
34677
+ __name(registerSkillsRevisionsUpdate, "registerSkillsRevisionsUpdate");
34678
+ function buildUpdateBody3(options) {
34679
+ if (options.name !== void 0 && options.clearName === true) {
34680
+ throw new CliError("Pass either --name or --clear-name, not both.");
34681
+ }
34682
+ if (options.description !== void 0 && options.clearDescription === true) {
34683
+ throw new CliError(
34684
+ "Pass either --description or --clear-description, not both."
34685
+ );
34686
+ }
34687
+ const body = {};
34688
+ if (options.name !== void 0) {
34689
+ body.revision_name = trimRequired(options.name, "--name");
34690
+ } else if (options.clearName === true) {
34691
+ body.revision_name = null;
34692
+ }
34693
+ if (options.description !== void 0) {
34694
+ body.revision_description = options.description;
34695
+ } else if (options.clearDescription === true) {
34696
+ body.revision_description = null;
34697
+ }
34698
+ if (Object.keys(body).length === 0) {
34699
+ throw new CliError(
34700
+ "Pass at least one of --name, --clear-name, --description, --clear-description."
34701
+ );
34702
+ }
34703
+ return body;
34704
+ }
34705
+ __name(buildUpdateBody3, "buildUpdateBody");
34706
+
34707
+ // src/commands/skills/revisions/index.ts
34708
+ function registerSkillsRevisions(skills) {
34709
+ const revisions = skills.command("revisions").description(
34710
+ "Manage a skill's version history (draft, promote, roll back). Prefer this over `skills file-update`, which edits the active version in place."
34711
+ );
34712
+ registerSkillsRevisionsList(revisions);
34713
+ registerSkillsRevisionsCreate(revisions);
34714
+ registerSkillsRevisionsFiles(revisions);
34715
+ registerSkillsRevisionsFileGet(revisions);
34716
+ registerSkillsRevisionsFileUpdate(revisions);
34717
+ registerSkillsRevisionsPromote(revisions);
34718
+ registerSkillsRevisionsUpdate(revisions);
34719
+ registerSkillsRevisionsDelete(revisions);
34720
+ }
34721
+ __name(registerSkillsRevisions, "registerSkillsRevisions");
34722
+
34046
34723
  // src/commands/skills/system.ts
34047
34724
  var SYSTEM_COLUMNS2 = [
34048
34725
  { header: "ID", cell: /* @__PURE__ */ __name((row) => row.id, "cell") },
@@ -34085,13 +34762,13 @@ __name(registerSkillsSystem, "registerSkillsSystem");
34085
34762
  // src/commands/skills/upload.ts
34086
34763
  import { readFile as readFile9, stat as stat2 } from "node:fs/promises";
34087
34764
  import { basename as basename3 } from "node:path";
34088
- import { z as z125 } from "zod";
34089
- var uploadSkillResponseSchema = z125.object({
34090
- skill: z125.object({
34091
- id: z125.string(),
34092
- name: z125.string(),
34093
- description: z125.string(),
34094
- team_id: z125.string()
34765
+ import { z as z126 } from "zod";
34766
+ var uploadSkillResponseSchema = z126.object({
34767
+ skill: z126.object({
34768
+ id: z126.string(),
34769
+ name: z126.string(),
34770
+ description: z126.string(),
34771
+ team_id: z126.string()
34095
34772
  })
34096
34773
  });
34097
34774
  function registerSkillsUpload(skills) {
@@ -34160,6 +34837,7 @@ function registerSkills(program) {
34160
34837
  registerSkillsFiles(skills);
34161
34838
  registerSkillsFileGet(skills);
34162
34839
  registerSkillsFileUpdate(skills);
34840
+ registerSkillsRevisions(skills);
34163
34841
  registerSkillsDownload(skills);
34164
34842
  registerSkillsGenerate(skills);
34165
34843
  }
@@ -34326,17 +35004,17 @@ function registerSuggestionsGet(suggestions) {
34326
35004
  __name(registerSuggestionsGet, "registerSuggestionsGet");
34327
35005
 
34328
35006
  // src/commands/suggestions/list.ts
34329
- import { z as z126 } from "zod";
34330
- var DEFAULT_LIMIT16 = 100;
34331
- var MIN_LIMIT18 = 1;
34332
- var MAX_LIMIT16 = 250;
34333
- var listEnvelopeSchema = z126.object({
34334
- data: z126.array(z126.unknown()),
34335
- pending_count: z126.number().int().nonnegative()
35007
+ import { z as z127 } from "zod";
35008
+ var DEFAULT_LIMIT18 = 100;
35009
+ var MIN_LIMIT20 = 1;
35010
+ var MAX_LIMIT18 = 250;
35011
+ var listEnvelopeSchema = z127.object({
35012
+ data: z127.array(z127.unknown()),
35013
+ pending_count: z127.number().int().nonnegative()
34336
35014
  });
34337
35015
  var STATUS_FILTERS = ["pending", "history"];
34338
35016
  var TITLE_PREVIEW_WIDTH2 = 50;
34339
- var TABLE_COLUMNS44 = [
35017
+ var TABLE_COLUMNS46 = [
34340
35018
  { header: "ID", cell: /* @__PURE__ */ __name((row) => row.id, "cell") },
34341
35019
  { header: "TYPE", cell: /* @__PURE__ */ __name((row) => row.type, "cell") },
34342
35020
  { header: "STATUS", cell: /* @__PURE__ */ __name((row) => row.status, "cell") },
@@ -34357,11 +35035,11 @@ function registerSuggestionsList(suggestions) {
34357
35035
  ).option(
34358
35036
  "--status <filter>",
34359
35037
  `which inbox to show (${STATUS_FILTERS.join("|")}, default: pending)`
34360
- ).option("--limit <n>", `page size (${MIN_LIMIT18}-${MAX_LIMIT16})`).option("--offset <n>", "number of suggestions to skip").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function listAction(agentId, options) {
35038
+ ).option("--limit <n>", `page size (${MIN_LIMIT20}-${MAX_LIMIT18})`).option("--offset <n>", "number of suggestions to skip").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function listAction(agentId, options) {
34361
35039
  const limit = parseLimit(options.limit, {
34362
- defaultValue: DEFAULT_LIMIT16,
34363
- min: MIN_LIMIT18,
34364
- max: MAX_LIMIT16
35040
+ defaultValue: DEFAULT_LIMIT18,
35041
+ min: MIN_LIMIT20,
35042
+ max: MAX_LIMIT18
34365
35043
  });
34366
35044
  const offset = parseOffset(options.offset);
34367
35045
  if (options.status !== void 0 && !isStatusFilter(options.status)) {
@@ -34414,7 +35092,7 @@ function registerSuggestionsList(suggestions) {
34414
35092
  console.log(`Pending total: ${pendingCount}`);
34415
35093
  return;
34416
35094
  }
34417
- console.log(renderTable(TABLE_COLUMNS44, data));
35095
+ console.log(renderTable(TABLE_COLUMNS46, data));
34418
35096
  console.log(
34419
35097
  `Showing ${data.length} \xB7 offset ${offset} \xB7 pending total ${pendingCount}`
34420
35098
  );
@@ -34538,10 +35216,10 @@ function registerTeamGet(team) {
34538
35216
  __name(registerTeamGet, "registerTeamGet");
34539
35217
 
34540
35218
  // src/commands/team/members.ts
34541
- var DEFAULT_LIMIT17 = 50;
34542
- var MIN_LIMIT19 = 1;
34543
- var MAX_LIMIT17 = 100;
34544
- var TABLE_COLUMNS45 = [
35219
+ var DEFAULT_LIMIT19 = 50;
35220
+ var MIN_LIMIT21 = 1;
35221
+ var MAX_LIMIT19 = 100;
35222
+ var TABLE_COLUMNS47 = [
34545
35223
  { header: "ID", cell: /* @__PURE__ */ __name((row) => row.id, "cell") },
34546
35224
  { header: "NAME", cell: /* @__PURE__ */ __name((row) => row.name ?? "", "cell") },
34547
35225
  { header: "EMAIL", cell: /* @__PURE__ */ __name((row) => row.email, "cell") },
@@ -34555,11 +35233,11 @@ function registerTeamMembers(team) {
34555
35233
  team.command("members").description("List members of a team").option(
34556
35234
  "--team <id>",
34557
35235
  "team ID (defaults to the team scoped to your credentials)"
34558
- ).option("--limit <n>", `page size (${MIN_LIMIT19}-${MAX_LIMIT17})`).option("--offset <n>", "number of members to skip").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function membersAction(options) {
35236
+ ).option("--limit <n>", `page size (${MIN_LIMIT21}-${MAX_LIMIT19})`).option("--offset <n>", "number of members to skip").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function membersAction(options) {
34559
35237
  const limit = parseLimit(options.limit, {
34560
- defaultValue: DEFAULT_LIMIT17,
34561
- min: MIN_LIMIT19,
34562
- max: MAX_LIMIT17
35238
+ defaultValue: DEFAULT_LIMIT19,
35239
+ min: MIN_LIMIT21,
35240
+ max: MAX_LIMIT19
34563
35241
  });
34564
35242
  const offset = parseOffset(options.offset);
34565
35243
  const config = await requireAuthenticatedConfig(this);
@@ -34592,7 +35270,7 @@ function registerTeamMembers(team) {
34592
35270
  console.log("No members found.");
34593
35271
  return;
34594
35272
  }
34595
- console.log(renderTable(TABLE_COLUMNS45, response.members));
35273
+ console.log(renderTable(TABLE_COLUMNS47, response.members));
34596
35274
  console.log(
34597
35275
  `Showing ${response.members.length} of ${response.total} \xB7 offset ${response.offset}`
34598
35276
  );
@@ -34601,9 +35279,9 @@ function registerTeamMembers(team) {
34601
35279
  __name(registerTeamMembers, "registerTeamMembers");
34602
35280
 
34603
35281
  // src/commands/team/use.ts
34604
- import { z as z127 } from "zod";
35282
+ import { z as z128 } from "zod";
34605
35283
  var TEAM_ID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
34606
- var teamIdSchema = z127.string().regex(TEAM_ID_SHAPE);
35284
+ var teamIdSchema = z128.string().regex(TEAM_ID_SHAPE);
34607
35285
  function registerTeamUse(team) {
34608
35286
  team.command("use <team-id>").description(
34609
35287
  "Set the default team for the active OAuth profile (overridable per-command via --team or DUVO_TEAM_ID)"
@@ -34689,10 +35367,10 @@ function registerTeam(program) {
34689
35367
  __name(registerTeam, "registerTeam");
34690
35368
 
34691
35369
  // src/commands/teams/create-org-team.ts
34692
- import { z as z128 } from "zod";
34693
- var createOrgTeamResponseSchema = z128.object({
34694
- id: z128.guid(),
34695
- name: z128.string()
35370
+ import { z as z129 } from "zod";
35371
+ var createOrgTeamResponseSchema = z129.object({
35372
+ id: z129.guid(),
35373
+ name: z129.string()
34696
35374
  });
34697
35375
  function registerTeamsCreateOrgTeam(teams) {
34698
35376
  teams.command("create-org-team <org-id>").description("Create a new team inside an organization you administer").requiredOption("--name <name>", "team name").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function createOrgTeamAction(orgId, options) {
@@ -34802,14 +35480,14 @@ function registerTeamsInviteOrgMember(teams) {
34802
35480
  __name(registerTeamsInviteOrgMember, "registerTeamsInviteOrgMember");
34803
35481
 
34804
35482
  // src/commands/teams/list.ts
34805
- import { z as z129 } from "zod";
34806
- var teamApiSchema2 = z129.object({
34807
- id: z129.string(),
34808
- name: z129.string(),
34809
- organization_id: z129.string().nullable()
35483
+ import { z as z130 } from "zod";
35484
+ var teamApiSchema2 = z130.object({
35485
+ id: z130.string(),
35486
+ name: z130.string(),
35487
+ organization_id: z130.string().nullable()
34810
35488
  });
34811
- var listMyTeamsResponseSchema3 = z129.object({
34812
- teams: z129.array(teamApiSchema2)
35489
+ var listMyTeamsResponseSchema3 = z130.object({
35490
+ teams: z130.array(teamApiSchema2)
34813
35491
  });
34814
35492
  function registerTeamsList(teams) {
34815
35493
  teams.command("list", { isDefault: true }).description("List every team you can act on").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function listAction(options) {
@@ -34852,21 +35530,21 @@ function registerTeamsList(teams) {
34852
35530
  __name(registerTeamsList, "registerTeamsList");
34853
35531
 
34854
35532
  // src/commands/teams/org-insights.ts
34855
- import { z as z130 } from "zod";
34856
- var headlineSchema = z130.object({
34857
- total_runs: z130.number(),
34858
- completed_runs: z130.number(),
34859
- failed_runs: z130.number(),
34860
- success_rate: z130.number().nullable(),
34861
- active_agents: z130.number(),
34862
- active_users: z130.number(),
34863
- start_date: z130.string(),
34864
- end_date: z130.string(),
34865
- truncated: z130.boolean(),
34866
- aggregated_teams: z130.number(),
34867
- total_teams: z130.number()
34868
- });
34869
- var orgInsightsHeadlineResponseSchema = z130.object({
35533
+ import { z as z131 } from "zod";
35534
+ var headlineSchema = z131.object({
35535
+ total_runs: z131.number(),
35536
+ completed_runs: z131.number(),
35537
+ failed_runs: z131.number(),
35538
+ success_rate: z131.number().nullable(),
35539
+ active_agents: z131.number(),
35540
+ active_users: z131.number(),
35541
+ start_date: z131.string(),
35542
+ end_date: z131.string(),
35543
+ truncated: z131.boolean(),
35544
+ aggregated_teams: z131.number(),
35545
+ total_teams: z131.number()
35546
+ });
35547
+ var orgInsightsHeadlineResponseSchema = z131.object({
34870
35548
  headline: headlineSchema
34871
35549
  });
34872
35550
  function formatRate(rate) {
@@ -34934,26 +35612,26 @@ function registerTeamsOrgInsights(teams) {
34934
35612
  __name(registerTeamsOrgInsights, "registerTeamsOrgInsights");
34935
35613
 
34936
35614
  // src/commands/teams/org-metrics.ts
34937
- import { z as z131 } from "zod";
34938
- var teamMetricSchema = z131.object({
34939
- team_id: z131.string(),
34940
- team_name: z131.string(),
34941
- is_deleted: z131.boolean(),
34942
- member_count: z131.number(),
34943
- assignment_count: z131.number(),
34944
- scheduled_job_count: z131.number(),
34945
- total_jobs: z131.number(),
34946
- completed_jobs: z131.number(),
34947
- failed_jobs: z131.number(),
34948
- total_runs: z131.number()
34949
- });
34950
- var orgInsightsMetricsResponseSchema = z131.object({
34951
- teams: z131.array(teamMetricSchema),
34952
- start_date: z131.string(),
34953
- end_date: z131.string(),
34954
- truncated: z131.boolean(),
34955
- total_teams: z131.number(),
34956
- org_member_count: z131.number()
35615
+ import { z as z132 } from "zod";
35616
+ var teamMetricSchema = z132.object({
35617
+ team_id: z132.string(),
35618
+ team_name: z132.string(),
35619
+ is_deleted: z132.boolean(),
35620
+ member_count: z132.number(),
35621
+ assignment_count: z132.number(),
35622
+ scheduled_job_count: z132.number(),
35623
+ total_jobs: z132.number(),
35624
+ completed_jobs: z132.number(),
35625
+ failed_jobs: z132.number(),
35626
+ total_runs: z132.number()
35627
+ });
35628
+ var orgInsightsMetricsResponseSchema = z132.object({
35629
+ teams: z132.array(teamMetricSchema),
35630
+ start_date: z132.string(),
35631
+ end_date: z132.string(),
35632
+ truncated: z132.boolean(),
35633
+ total_teams: z132.number(),
35634
+ org_member_count: z132.number()
34957
35635
  });
34958
35636
  function registerTeamsOrgMetrics(teams) {
34959
35637
  teams.command("org-metrics <org-id>").description("Show per-team run metrics across an organization").option("--start-date <date>", "window start (ISO 8601, default 7d ago)").option("--end-date <date>", "window end (ISO 8601, default now)").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function orgMetricsAction(orgId, options) {
@@ -35016,20 +35694,20 @@ ${total_teams} teams${suffix} \xB7 ${org_member_count} org members`
35016
35694
  __name(registerTeamsOrgMetrics, "registerTeamsOrgMetrics");
35017
35695
 
35018
35696
  // src/commands/teams/org-usage.ts
35019
- import { z as z132 } from "zod";
35697
+ import { z as z133 } from "zod";
35020
35698
  var GRANULARITIES = ["day", "week", "month"];
35021
35699
  var DEFAULT_LOOKBACK_MS = 30 * 24 * 60 * 60 * 1e3;
35022
- var bucketSchema = z132.object({
35023
- period: z132.string(),
35024
- total_runs: z132.number(),
35025
- scheduled_runs: z132.number(),
35026
- on_demand_runs: z132.number()
35027
- });
35028
- var usageChartResponseSchema = z132.object({
35029
- buckets: z132.array(bucketSchema),
35030
- granularity: z132.enum(GRANULARITIES),
35031
- truncated: z132.boolean(),
35032
- total_teams: z132.number()
35700
+ var bucketSchema = z133.object({
35701
+ period: z133.string(),
35702
+ total_runs: z133.number(),
35703
+ scheduled_runs: z133.number(),
35704
+ on_demand_runs: z133.number()
35705
+ });
35706
+ var usageChartResponseSchema = z133.object({
35707
+ buckets: z133.array(bucketSchema),
35708
+ granularity: z133.enum(GRANULARITIES),
35709
+ truncated: z133.boolean(),
35710
+ total_teams: z133.number()
35033
35711
  });
35034
35712
  function registerTeamsOrgUsage(teams) {
35035
35713
  teams.command("org-usage <org-id>").description("Show org-wide run volume over time (scheduled vs on-demand)").option("--start-date <date>", "window start (ISO 8601, default 30d ago)").option("--end-date <date>", "window end (ISO 8601, default now)").option(
@@ -35088,17 +35766,17 @@ function registerTeamsOrgUsage(teams) {
35088
35766
  __name(registerTeamsOrgUsage, "registerTeamsOrgUsage");
35089
35767
 
35090
35768
  // src/commands/teams/org.ts
35091
- import { z as z133 } from "zod";
35092
- var orgTeamSchema = z133.object({
35093
- id: z133.string(),
35094
- name: z133.string(),
35095
- userIsMember: z133.boolean(),
35096
- userRole: z133.string().nullable(),
35097
- memberCount: z133.number()
35769
+ import { z as z134 } from "zod";
35770
+ var orgTeamSchema = z134.object({
35771
+ id: z134.string(),
35772
+ name: z134.string(),
35773
+ userIsMember: z134.boolean(),
35774
+ userRole: z134.string().nullable(),
35775
+ memberCount: z134.number()
35098
35776
  });
35099
- var listOrgTeamsResponseSchema = z133.object({
35100
- teams: z133.array(orgTeamSchema),
35101
- total: z133.number()
35777
+ var listOrgTeamsResponseSchema = z134.object({
35778
+ teams: z134.array(orgTeamSchema),
35779
+ total: z134.number()
35102
35780
  });
35103
35781
  var SORT_BY_VALUES = ["createdAt", "name"];
35104
35782
  function registerTeamsOrg(teams) {
@@ -35159,17 +35837,17 @@ function registerTeamsOrg(teams) {
35159
35837
  __name(registerTeamsOrg, "registerTeamsOrg");
35160
35838
 
35161
35839
  // src/commands/teams/orgs.ts
35162
- import { z as z134 } from "zod";
35163
- var orgMembershipSchema = z134.object({
35164
- organization: z134.object({
35165
- id: z134.string(),
35166
- name: z134.string()
35840
+ import { z as z135 } from "zod";
35841
+ var orgMembershipSchema = z135.object({
35842
+ organization: z135.object({
35843
+ id: z135.string(),
35844
+ name: z135.string()
35167
35845
  }),
35168
- role: z134.string(),
35169
- memberCount: z134.number()
35846
+ role: z135.string(),
35847
+ memberCount: z135.number()
35170
35848
  });
35171
- var listMyOrganizationsResponseSchema = z134.object({
35172
- memberships: z134.array(orgMembershipSchema)
35849
+ var listMyOrganizationsResponseSchema = z135.object({
35850
+ memberships: z135.array(orgMembershipSchema)
35173
35851
  });
35174
35852
  function registerTeamsOrgs(teams) {
35175
35853
  teams.command("orgs").description("List the organizations you belong to and your role in each").option("--json", "output raw JSON from the API").action(/* @__PURE__ */ __name(async function orgsAction(options) {
@@ -35347,7 +36025,7 @@ __name(isStandaloneBinary, "isStandaloneBinary");
35347
36025
  import { createRequire } from "node:module";
35348
36026
  function getPackageMeta() {
35349
36027
  if (true) {
35350
- return { name: "@duvoai/cli", version: "1.41.0" };
36028
+ return { name: "@duvoai/cli", version: "1.42.0" };
35351
36029
  }
35352
36030
  const require2 = createRequire(import.meta.url);
35353
36031
  const raw = require2("../../package.json");