@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 +831 -153
- package/dist/bin/duvo.js.map +4 -4
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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/
|
|
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 =
|
|
33965
|
+
const content = readContentOption(options);
|
|
33746
33966
|
const { apiKey, apiBaseUrl } = await requireAuthenticatedConfig(this);
|
|
33747
|
-
const encodedPath = filePath
|
|
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
|
|
34089
|
-
var uploadSkillResponseSchema =
|
|
34090
|
-
skill:
|
|
34091
|
-
id:
|
|
34092
|
-
name:
|
|
34093
|
-
description:
|
|
34094
|
-
team_id:
|
|
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
|
|
34330
|
-
var
|
|
34331
|
-
var
|
|
34332
|
-
var
|
|
34333
|
-
var listEnvelopeSchema =
|
|
34334
|
-
data:
|
|
34335
|
-
pending_count:
|
|
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
|
|
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 (${
|
|
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:
|
|
34363
|
-
min:
|
|
34364
|
-
max:
|
|
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(
|
|
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
|
|
34542
|
-
var
|
|
34543
|
-
var
|
|
34544
|
-
var
|
|
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 (${
|
|
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:
|
|
34561
|
-
min:
|
|
34562
|
-
max:
|
|
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(
|
|
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
|
|
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 =
|
|
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
|
|
34693
|
-
var createOrgTeamResponseSchema =
|
|
34694
|
-
id:
|
|
34695
|
-
name:
|
|
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
|
|
34806
|
-
var teamApiSchema2 =
|
|
34807
|
-
id:
|
|
34808
|
-
name:
|
|
34809
|
-
organization_id:
|
|
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 =
|
|
34812
|
-
teams:
|
|
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
|
|
34856
|
-
var headlineSchema =
|
|
34857
|
-
total_runs:
|
|
34858
|
-
completed_runs:
|
|
34859
|
-
failed_runs:
|
|
34860
|
-
success_rate:
|
|
34861
|
-
active_agents:
|
|
34862
|
-
active_users:
|
|
34863
|
-
start_date:
|
|
34864
|
-
end_date:
|
|
34865
|
-
truncated:
|
|
34866
|
-
aggregated_teams:
|
|
34867
|
-
total_teams:
|
|
34868
|
-
});
|
|
34869
|
-
var orgInsightsHeadlineResponseSchema =
|
|
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
|
|
34938
|
-
var teamMetricSchema =
|
|
34939
|
-
team_id:
|
|
34940
|
-
team_name:
|
|
34941
|
-
is_deleted:
|
|
34942
|
-
member_count:
|
|
34943
|
-
assignment_count:
|
|
34944
|
-
scheduled_job_count:
|
|
34945
|
-
total_jobs:
|
|
34946
|
-
completed_jobs:
|
|
34947
|
-
failed_jobs:
|
|
34948
|
-
total_runs:
|
|
34949
|
-
});
|
|
34950
|
-
var orgInsightsMetricsResponseSchema =
|
|
34951
|
-
teams:
|
|
34952
|
-
start_date:
|
|
34953
|
-
end_date:
|
|
34954
|
-
truncated:
|
|
34955
|
-
total_teams:
|
|
34956
|
-
org_member_count:
|
|
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
|
|
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 =
|
|
35023
|
-
period:
|
|
35024
|
-
total_runs:
|
|
35025
|
-
scheduled_runs:
|
|
35026
|
-
on_demand_runs:
|
|
35027
|
-
});
|
|
35028
|
-
var usageChartResponseSchema =
|
|
35029
|
-
buckets:
|
|
35030
|
-
granularity:
|
|
35031
|
-
truncated:
|
|
35032
|
-
total_teams:
|
|
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
|
|
35092
|
-
var orgTeamSchema =
|
|
35093
|
-
id:
|
|
35094
|
-
name:
|
|
35095
|
-
userIsMember:
|
|
35096
|
-
userRole:
|
|
35097
|
-
memberCount:
|
|
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 =
|
|
35100
|
-
teams:
|
|
35101
|
-
total:
|
|
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
|
|
35163
|
-
var orgMembershipSchema =
|
|
35164
|
-
organization:
|
|
35165
|
-
id:
|
|
35166
|
-
name:
|
|
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:
|
|
35169
|
-
memberCount:
|
|
35846
|
+
role: z135.string(),
|
|
35847
|
+
memberCount: z135.number()
|
|
35170
35848
|
});
|
|
35171
|
-
var listMyOrganizationsResponseSchema =
|
|
35172
|
-
memberships:
|
|
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.
|
|
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");
|