@vm0/cli 9.219.0 → 9.219.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{agent-4SQZDYYN.js → agent-6TGGHCAT.js} +4 -4
- package/{automation-WPG4IYVE.js → automation-UPVMYME3.js} +21 -11
- package/automation-UPVMYME3.js.map +1 -0
- package/{banking-S7GOP6WI.js → banking-K4E2GBY7.js} +2 -2
- package/{chat-6E34QZHI.js → chat-3JUQFSSY.js} +2 -2
- package/{chunk-PTXI3X6L.js → chunk-5AIMJ6O5.js} +2 -2
- package/{chunk-NUCGXUQW.js → chunk-APCV4ZUL.js} +2 -2
- package/{chunk-Q47FRJVT.js → chunk-CWBLSKVL.js} +45 -176
- package/chunk-CWBLSKVL.js.map +1 -0
- package/{chunk-RYGMBENC.js → chunk-DF3WVSZY.js} +2 -2
- package/{chunk-B33JIZI2.js → chunk-DLB4B2NY.js} +3 -3
- package/chunk-H63W4KQL.js +160 -0
- package/chunk-H63W4KQL.js.map +1 -0
- package/{chunk-UQBJX5J5.js → chunk-MY2ZR6YU.js} +7 -7
- package/{chunk-7DWLR3AY.js → chunk-NI3BDNLY.js} +9 -7
- package/{chunk-7DWLR3AY.js.map → chunk-NI3BDNLY.js.map} +1 -1
- package/{chunk-O5WIIYWN.js → chunk-VLGMCLXQ.js} +2 -2
- package/{chunk-C3NCF7AC.js → chunk-YY7SV2BZ.js} +19 -18
- package/chunk-YY7SV2BZ.js.map +1 -0
- package/clerk.generated-ERU55NQP.js +402 -0
- package/clerk.generated-ERU55NQP.js.map +1 -0
- package/{computer-use-P5NZISFJ.js → computer-use-RFTIT5ZT.js} +2 -2
- package/{connector-BF7GN5KJ.js → connector-6VGK6J4L.js} +3 -3
- package/{credit-MUMH2AFQ.js → credit-AFPBXBIU.js} +2 -2
- package/{developer-support-YRODRFDP.js → developer-support-HATEQ7AD.js} +2 -2
- package/{doctor-SYQVWI4X.js → doctor-IAOTOO4G.js} +5 -5
- package/dropbox.generated-ZZKEVL5X.js +140 -0
- package/dropbox.generated-ZZKEVL5X.js.map +1 -0
- package/{generate-SOTMY5L2.js → generate-TXO7YLT3.js} +3 -3
- package/{github-M5QMAGUR.js → github-WAXJU2GY.js} +2 -2
- package/{goal-UCWUNBDX.js → goal-UIJNFLUD.js} +2 -2
- package/{host-FBIUSQM5.js → host-JN3SWFZN.js} +2 -2
- package/index.js +20 -18
- package/index.js.map +1 -1
- package/{logs-2WS7C3NG.js → logs-5LLAN46D.js} +13 -11
- package/{logs-2WS7C3NG.js.map → logs-5LLAN46D.js.map} +1 -1
- package/{maps-F6HS3TX3.js → maps-U6U7CVN4.js} +2 -2
- package/{model-WVSFDOUB.js → model-JQGMSCEW.js} +3 -3
- package/{model-provider-RW5KSE2A.js → model-provider-HPULHQCP.js} +3 -3
- package/{org-HG7QC6H2.js → org-P64YC3X4.js} +2 -2
- package/package.json +1 -1
- package/{phone-Y53A3YR6.js → phone-DQ642OPH.js} +2 -2
- package/{preference-PDDNKSID.js → preference-BYLQWJJH.js} +2 -2
- package/{resource-4RXH7SID.js → resource-HON6W7BP.js} +2 -2
- package/{schedule-XUGLVIVF.js → schedule-MTI5OP23.js} +2 -2
- package/schedule-MTI5OP23.js.map +1 -0
- package/{search-NRX5C4BZ.js → search-NDBJJPWS.js} +10 -8
- package/{search-NRX5C4BZ.js.map → search-NDBJJPWS.js.map} +1 -1
- package/{secret-G6ZROM3S.js → secret-AC6UW4DJ.js} +3 -3
- package/sentry.generated-Y3V3MFG5.js +112 -0
- package/sentry.generated-Y3V3MFG5.js.map +1 -0
- package/{slack-UE7PHE5Q.js → slack-S6KJLE6R.js} +2 -2
- package/strava.generated-FDURULCZ.js +76 -0
- package/strava.generated-FDURULCZ.js.map +1 -0
- package/{telegram-FMO5JNQL.js → telegram-SD6TEM2P.js} +2 -2
- package/{variable-3QU5KSPD.js → variable-7O57XR74.js} +2 -2
- package/{web-NUS7HONQ.js → web-3MQWFUZU.js} +2 -2
- package/{whoami-BVBVPCEX.js → whoami-U6VBDTX5.js} +4 -4
- package/{workflow-KFXYP54E.js → workflow-GGH4WU2J.js} +2 -2
- package/xero.generated-NPSQE6GC.js +164 -0
- package/xero.generated-NPSQE6GC.js.map +1 -0
- package/zero.js +32 -32
- package/automation-WPG4IYVE.js.map +0 -1
- package/chunk-C3NCF7AC.js.map +0 -1
- package/chunk-Q47FRJVT.js.map +0 -1
- package/clerk.generated-CUIJPEBA.js +0 -335
- package/clerk.generated-CUIJPEBA.js.map +0 -1
- package/dropbox.generated-SM45XNZI.js +0 -111
- package/dropbox.generated-SM45XNZI.js.map +0 -1
- package/schedule-XUGLVIVF.js.map +0 -1
- package/sentry.generated-TQZTJGQ4.js +0 -90
- package/sentry.generated-TQZTJGQ4.js.map +0 -1
- package/strava.generated-FK4SMYR7.js +0 -63
- package/strava.generated-FK4SMYR7.js.map +0 -1
- package/xero.generated-UVAXXS6Q.js +0 -129
- package/xero.generated-UVAXXS6Q.js.map +0 -1
- /package/{agent-4SQZDYYN.js.map → agent-6TGGHCAT.js.map} +0 -0
- /package/{banking-S7GOP6WI.js.map → banking-K4E2GBY7.js.map} +0 -0
- /package/{chat-6E34QZHI.js.map → chat-3JUQFSSY.js.map} +0 -0
- /package/{chunk-PTXI3X6L.js.map → chunk-5AIMJ6O5.js.map} +0 -0
- /package/{chunk-NUCGXUQW.js.map → chunk-APCV4ZUL.js.map} +0 -0
- /package/{chunk-RYGMBENC.js.map → chunk-DF3WVSZY.js.map} +0 -0
- /package/{chunk-B33JIZI2.js.map → chunk-DLB4B2NY.js.map} +0 -0
- /package/{chunk-UQBJX5J5.js.map → chunk-MY2ZR6YU.js.map} +0 -0
- /package/{chunk-O5WIIYWN.js.map → chunk-VLGMCLXQ.js.map} +0 -0
- /package/{computer-use-P5NZISFJ.js.map → computer-use-RFTIT5ZT.js.map} +0 -0
- /package/{connector-BF7GN5KJ.js.map → connector-6VGK6J4L.js.map} +0 -0
- /package/{credit-MUMH2AFQ.js.map → credit-AFPBXBIU.js.map} +0 -0
- /package/{developer-support-YRODRFDP.js.map → developer-support-HATEQ7AD.js.map} +0 -0
- /package/{doctor-SYQVWI4X.js.map → doctor-IAOTOO4G.js.map} +0 -0
- /package/{generate-SOTMY5L2.js.map → generate-TXO7YLT3.js.map} +0 -0
- /package/{github-M5QMAGUR.js.map → github-WAXJU2GY.js.map} +0 -0
- /package/{goal-UCWUNBDX.js.map → goal-UIJNFLUD.js.map} +0 -0
- /package/{host-FBIUSQM5.js.map → host-JN3SWFZN.js.map} +0 -0
- /package/{maps-F6HS3TX3.js.map → maps-U6U7CVN4.js.map} +0 -0
- /package/{model-WVSFDOUB.js.map → model-JQGMSCEW.js.map} +0 -0
- /package/{model-provider-RW5KSE2A.js.map → model-provider-HPULHQCP.js.map} +0 -0
- /package/{org-HG7QC6H2.js.map → org-P64YC3X4.js.map} +0 -0
- /package/{phone-Y53A3YR6.js.map → phone-DQ642OPH.js.map} +0 -0
- /package/{preference-PDDNKSID.js.map → preference-BYLQWJJH.js.map} +0 -0
- /package/{resource-4RXH7SID.js.map → resource-HON6W7BP.js.map} +0 -0
- /package/{secret-G6ZROM3S.js.map → secret-AC6UW4DJ.js.map} +0 -0
- /package/{slack-UE7PHE5Q.js.map → slack-S6KJLE6R.js.map} +0 -0
- /package/{telegram-FMO5JNQL.js.map → telegram-SD6TEM2P.js.map} +0 -0
- /package/{variable-3QU5KSPD.js.map → variable-7O57XR74.js.map} +0 -0
- /package/{web-NUS7HONQ.js.map → web-3MQWFUZU.js.map} +0 -0
- /package/{whoami-BVBVPCEX.js.map → whoami-U6VBDTX5.js.map} +0 -0
- /package/{workflow-KFXYP54E.js.map → workflow-GGH4WU2J.js.map} +0 -0
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
MODEL_PROVIDER_TYPES
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YY7SV2BZ.js";
|
|
7
7
|
import {
|
|
8
8
|
init_esm_shims
|
|
9
9
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -40,4 +40,4 @@ export {
|
|
|
40
40
|
formatModelProviderRoute,
|
|
41
41
|
formatModelPolicyStatus
|
|
42
42
|
};
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
43
|
+
//# sourceMappingURL=chunk-DF3WVSZY.js.map
|
|
@@ -50,7 +50,7 @@ if (DSN) {
|
|
|
50
50
|
Sentry.init({
|
|
51
51
|
dsn: DSN,
|
|
52
52
|
environment: process.env.SENTRY_ENVIRONMENT ?? "production",
|
|
53
|
-
release: "9.219.
|
|
53
|
+
release: "9.219.1",
|
|
54
54
|
sendDefaultPii: false,
|
|
55
55
|
tracesSampleRate: 0,
|
|
56
56
|
shutdownTimeout: 500,
|
|
@@ -69,7 +69,7 @@ if (DSN) {
|
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
71
|
Sentry.setContext("cli", {
|
|
72
|
-
version: "9.219.
|
|
72
|
+
version: "9.219.1",
|
|
73
73
|
command: process.argv.slice(2).join(" ")
|
|
74
74
|
});
|
|
75
75
|
Sentry.setContext("runtime", {
|
|
@@ -146,4 +146,4 @@ async function configureGlobalProxyFromEnv() {
|
|
|
146
146
|
export {
|
|
147
147
|
configureGlobalProxyFromEnv
|
|
148
148
|
};
|
|
149
|
-
//# sourceMappingURL=chunk-
|
|
149
|
+
//# sourceMappingURL=chunk-DLB4B2NY.js.map
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __createRequire } from "node:module";
|
|
3
|
+
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
init_esm_shims
|
|
6
|
+
} from "./chunk-DIRAZ3YX.js";
|
|
7
|
+
|
|
8
|
+
// src/lib/utils/time-parser.ts
|
|
9
|
+
init_esm_shims();
|
|
10
|
+
var ISO_8601_PATTERN = /^(\d{4})-(\d{2})-(\d{2})(?:[Tt](\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,9})?)?(?:[Zz]|[+-]\d{2}:?\d{2})?)?$/;
|
|
11
|
+
var DAYS_BY_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
12
|
+
var MAX_DATE_TIMESTAMP_MS = 864e13;
|
|
13
|
+
function parseTime(timeStr) {
|
|
14
|
+
const relativeMatch = timeStr.match(/^(\d+)([smhdw])$/);
|
|
15
|
+
if (relativeMatch) {
|
|
16
|
+
const value = Number(relativeMatch[1]);
|
|
17
|
+
const unit = relativeMatch[2];
|
|
18
|
+
const timestamp2 = parseRelativeTime(value, unit);
|
|
19
|
+
if (timestamp2 !== void 0) {
|
|
20
|
+
return timestamp2;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (/^\d+$/.test(timeStr)) {
|
|
24
|
+
const rawTimestamp = Number(timeStr);
|
|
25
|
+
const timestamp2 = rawTimestamp < 1e10 ? rawTimestamp * 1e3 : rawTimestamp;
|
|
26
|
+
if (isValidTimestamp(timestamp2)) {
|
|
27
|
+
return timestamp2;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const timestamp = parseIsoTime(timeStr);
|
|
31
|
+
if (timestamp !== void 0) {
|
|
32
|
+
return timestamp;
|
|
33
|
+
}
|
|
34
|
+
throw new Error(
|
|
35
|
+
`Invalid time format: "${timeStr}". Supported formats: relative (5m, 2h, 1d), ISO 8601 (2024-01-15T10:30:00Z), Unix timestamp`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
function parseIsoTime(timeStr) {
|
|
39
|
+
const match = ISO_8601_PATTERN.exec(timeStr);
|
|
40
|
+
if (!match) {
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
const year = Number(match[1]);
|
|
44
|
+
const month = Number(match[2]);
|
|
45
|
+
const day = Number(match[3]);
|
|
46
|
+
const hour = match[4] ? Number(match[4]) : 0;
|
|
47
|
+
const minute = match[5] ? Number(match[5]) : 0;
|
|
48
|
+
const second = match[6] ? Number(match[6]) : 0;
|
|
49
|
+
if (!Number.isInteger(year) || !Number.isInteger(month) || !Number.isInteger(day) || !Number.isInteger(hour) || !Number.isInteger(minute) || !Number.isInteger(second) || month < 1 || month > 12 || day < 1 || day > daysInMonth(year, month) || hour > 23 || minute > 59 || second > 59) {
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
const timestamp = new Date(timeStr).getTime();
|
|
53
|
+
return isValidTimestamp(timestamp) ? timestamp : void 0;
|
|
54
|
+
}
|
|
55
|
+
function daysInMonth(year, month) {
|
|
56
|
+
if (month === 2) {
|
|
57
|
+
return isLeapYear(year) ? 29 : 28;
|
|
58
|
+
}
|
|
59
|
+
return DAYS_BY_MONTH[month - 1] ?? 0;
|
|
60
|
+
}
|
|
61
|
+
function isLeapYear(year) {
|
|
62
|
+
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
63
|
+
}
|
|
64
|
+
function parseRelativeTime(value, unit) {
|
|
65
|
+
if (!Number.isSafeInteger(value)) {
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
const multipliers = {
|
|
70
|
+
s: 1e3,
|
|
71
|
+
// seconds
|
|
72
|
+
m: 60 * 1e3,
|
|
73
|
+
// minutes
|
|
74
|
+
h: 60 * 60 * 1e3,
|
|
75
|
+
// hours
|
|
76
|
+
d: 24 * 60 * 60 * 1e3,
|
|
77
|
+
// days
|
|
78
|
+
w: 7 * 24 * 60 * 60 * 1e3
|
|
79
|
+
// weeks
|
|
80
|
+
};
|
|
81
|
+
const multiplier = multipliers[unit];
|
|
82
|
+
if (!multiplier) {
|
|
83
|
+
throw new Error(`Unknown time unit: ${unit}`);
|
|
84
|
+
}
|
|
85
|
+
const timestamp = now - value * multiplier;
|
|
86
|
+
return isValidTimestamp(timestamp) ? timestamp : void 0;
|
|
87
|
+
}
|
|
88
|
+
function isValidTimestamp(timestamp) {
|
|
89
|
+
return Number.isSafeInteger(timestamp) && Math.abs(timestamp) <= MAX_DATE_TIMESTAMP_MS;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/lib/utils/log-pagination.ts
|
|
93
|
+
init_esm_shims();
|
|
94
|
+
function parsePositiveLogCount(value, optionName) {
|
|
95
|
+
const trimmed = value.trim();
|
|
96
|
+
if (!/^0*[1-9]\d*$/.test(trimmed)) {
|
|
97
|
+
throw new Error(`Option ${optionName} must be a positive integer`);
|
|
98
|
+
}
|
|
99
|
+
const count = Number(trimmed);
|
|
100
|
+
if (!Number.isSafeInteger(count)) {
|
|
101
|
+
throw new Error(`Option ${optionName} must be a positive integer`);
|
|
102
|
+
}
|
|
103
|
+
return count;
|
|
104
|
+
}
|
|
105
|
+
function parseBoundedLogCount(value, optionName, min, max) {
|
|
106
|
+
const trimmed = value.trim();
|
|
107
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
108
|
+
throw new Error(`${optionName} must be between ${min} and ${max}`);
|
|
109
|
+
}
|
|
110
|
+
const count = Number(trimmed);
|
|
111
|
+
if (!Number.isSafeInteger(count) || count < min || count > max) {
|
|
112
|
+
throw new Error(`${optionName} must be between ${min} and ${max}`);
|
|
113
|
+
}
|
|
114
|
+
return count;
|
|
115
|
+
}
|
|
116
|
+
async function collectLogItems(options) {
|
|
117
|
+
const collected = [];
|
|
118
|
+
const seenCursors = /* @__PURE__ */ new Set();
|
|
119
|
+
let cursor;
|
|
120
|
+
while (true) {
|
|
121
|
+
const requestLimit = options.targetCount === "all" ? options.pageLimit : Math.min(options.pageLimit, options.targetCount - collected.length);
|
|
122
|
+
const page = await options.fetchPage({
|
|
123
|
+
sinceTime: options.sinceTime,
|
|
124
|
+
cursor,
|
|
125
|
+
limit: requestLimit,
|
|
126
|
+
order: options.order
|
|
127
|
+
});
|
|
128
|
+
collected.push(...page.items);
|
|
129
|
+
if (options.targetCount !== "all" && collected.length >= options.targetCount) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
const nextCursor = page.nextCursor ?? null;
|
|
133
|
+
if (!page.hasMore || !nextCursor || seenCursors.has(nextCursor)) {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
seenCursors.add(nextCursor);
|
|
137
|
+
cursor = nextCursor;
|
|
138
|
+
}
|
|
139
|
+
const entries = options.targetCount === "all" ? collected : collected.slice(0, options.targetCount);
|
|
140
|
+
return options.order === "desc" ? entries.reverse() : entries;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/lib/utils/search-query.ts
|
|
144
|
+
init_esm_shims();
|
|
145
|
+
function parseSearchQuery(value, label) {
|
|
146
|
+
const trimmed = value.trim();
|
|
147
|
+
if (!trimmed) {
|
|
148
|
+
throw new Error(`${label} cannot be empty.`);
|
|
149
|
+
}
|
|
150
|
+
return trimmed;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export {
|
|
154
|
+
parseTime,
|
|
155
|
+
parsePositiveLogCount,
|
|
156
|
+
parseBoundedLogCount,
|
|
157
|
+
collectLogItems,
|
|
158
|
+
parseSearchQuery
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=chunk-H63W4KQL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils/time-parser.ts","../src/lib/utils/log-pagination.ts","../src/lib/utils/search-query.ts"],"sourcesContent":["/**\n * Time parser utility for --since option\n *\n * Supports:\n * - Relative time: 5s, 10m, 2h, 1d, 1w (seconds, minutes, hours, days, weeks)\n * - Absolute time: ISO 8601 format (2024-01-15T10:30:00Z)\n * - Unix timestamp: 1705312200 or 1705312200000 (seconds or milliseconds)\n */\n\n/**\n * Parse a time string and return a Unix timestamp in milliseconds\n * @param timeStr - Time string to parse\n * @returns Unix timestamp in milliseconds\n * @throws Error if the time string is invalid\n */\nconst ISO_8601_PATTERN =\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:[Tt](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d{1,9})?)?(?:[Zz]|[+-]\\d{2}:?\\d{2})?)?$/;\nconst DAYS_BY_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst MAX_DATE_TIMESTAMP_MS = 8_640_000_000_000_000;\n\nexport function parseTime(timeStr: string): number {\n // Try relative time first (e.g., \"5m\", \"2h\", \"1d\")\n const relativeMatch = timeStr.match(/^(\\d+)([smhdw])$/);\n if (relativeMatch) {\n const value = Number(relativeMatch[1]!);\n const unit = relativeMatch[2]!;\n const timestamp = parseRelativeTime(value, unit);\n if (timestamp !== undefined) {\n return timestamp;\n }\n }\n\n // Try Unix timestamp (seconds or milliseconds)\n if (/^\\d+$/.test(timeStr)) {\n const rawTimestamp = Number(timeStr);\n // If timestamp is less than year 2000 in seconds, assume it's already in ms\n // If it looks like seconds (< 10000000000), convert to ms\n const timestamp =\n rawTimestamp < 10000000000 ? rawTimestamp * 1000 : rawTimestamp;\n if (isValidTimestamp(timestamp)) {\n return timestamp;\n }\n }\n\n // Try ISO 8601 format\n const timestamp = parseIsoTime(timeStr);\n if (timestamp !== undefined) {\n return timestamp;\n }\n\n throw new Error(\n `Invalid time format: \"${timeStr}\". ` +\n `Supported formats: relative (5m, 2h, 1d), ISO 8601 (2024-01-15T10:30:00Z), Unix timestamp`,\n );\n}\n\nfunction parseIsoTime(timeStr: string): number | undefined {\n const match = ISO_8601_PATTERN.exec(timeStr);\n if (!match) {\n return undefined;\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = match[4] ? Number(match[4]) : 0;\n const minute = match[5] ? Number(match[5]) : 0;\n const second = match[6] ? Number(match[6]) : 0;\n\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n !Number.isInteger(day) ||\n !Number.isInteger(hour) ||\n !Number.isInteger(minute) ||\n !Number.isInteger(second) ||\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > daysInMonth(year, month) ||\n hour > 23 ||\n minute > 59 ||\n second > 59\n ) {\n return undefined;\n }\n\n const timestamp = new Date(timeStr).getTime();\n return isValidTimestamp(timestamp) ? timestamp : undefined;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) {\n return isLeapYear(year) ? 29 : 28;\n }\n return DAYS_BY_MONTH[month - 1] ?? 0;\n}\n\nfunction isLeapYear(year: number): boolean {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\n/**\n * Parse relative time and return Unix timestamp in milliseconds\n */\nfunction parseRelativeTime(value: number, unit: string): number | undefined {\n if (!Number.isSafeInteger(value)) {\n return undefined;\n }\n\n const now = Date.now();\n const multipliers: Record<string, number> = {\n s: 1000, // seconds\n m: 60 * 1000, // minutes\n h: 60 * 60 * 1000, // hours\n d: 24 * 60 * 60 * 1000, // days\n w: 7 * 24 * 60 * 60 * 1000, // weeks\n };\n\n const multiplier = multipliers[unit];\n if (!multiplier) {\n throw new Error(`Unknown time unit: ${unit}`);\n }\n\n const timestamp = now - value * multiplier;\n return isValidTimestamp(timestamp) ? timestamp : undefined;\n}\n\nfunction isValidTimestamp(timestamp: number): boolean {\n return (\n Number.isSafeInteger(timestamp) &&\n Math.abs(timestamp) <= MAX_DATE_TIMESTAMP_MS\n );\n}\n","type LogOrder = \"asc\" | \"desc\";\n\ninterface CursorLogPageRequest {\n readonly sinceTime?: number;\n readonly cursor?: string;\n readonly limit: number;\n readonly order: LogOrder;\n}\n\ninterface CursorLogPage<T> {\n readonly items: readonly T[];\n readonly hasMore: boolean;\n readonly nextCursor?: string | null;\n}\n\ninterface CollectLogItemsOptions<T> {\n readonly fetchPage: (\n request: CursorLogPageRequest,\n ) => Promise<CursorLogPage<T>>;\n readonly sinceTime?: number;\n readonly targetCount: number | \"all\";\n readonly order: LogOrder;\n readonly pageLimit: number;\n}\n\nexport function parsePositiveLogCount(\n value: string,\n optionName: string,\n): number {\n const trimmed = value.trim();\n if (!/^0*[1-9]\\d*$/.test(trimmed)) {\n throw new Error(`Option ${optionName} must be a positive integer`);\n }\n\n const count = Number(trimmed);\n if (!Number.isSafeInteger(count)) {\n throw new Error(`Option ${optionName} must be a positive integer`);\n }\n\n return count;\n}\n\nexport function parseBoundedLogCount(\n value: string,\n optionName: string,\n min: number,\n max: number,\n): number {\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n throw new Error(`${optionName} must be between ${min} and ${max}`);\n }\n\n const count = Number(trimmed);\n if (!Number.isSafeInteger(count) || count < min || count > max) {\n throw new Error(`${optionName} must be between ${min} and ${max}`);\n }\n\n return count;\n}\n\nexport async function collectLogItems<T>(\n options: CollectLogItemsOptions<T>,\n): Promise<T[]> {\n const collected: T[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n\n while (true) {\n const requestLimit =\n options.targetCount === \"all\"\n ? options.pageLimit\n : Math.min(options.pageLimit, options.targetCount - collected.length);\n\n const page = await options.fetchPage({\n sinceTime: options.sinceTime,\n cursor,\n limit: requestLimit,\n order: options.order,\n });\n\n collected.push(...page.items);\n\n if (\n options.targetCount !== \"all\" &&\n collected.length >= options.targetCount\n ) {\n break;\n }\n\n const nextCursor = page.nextCursor ?? null;\n if (!page.hasMore || !nextCursor || seenCursors.has(nextCursor)) {\n break;\n }\n\n seenCursors.add(nextCursor);\n cursor = nextCursor;\n }\n\n const entries =\n options.targetCount === \"all\"\n ? collected\n : collected.slice(0, options.targetCount);\n\n return options.order === \"desc\" ? entries.reverse() : entries;\n}\n","export function parseSearchQuery(value: string, label: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`${label} cannot be empty.`);\n }\n return trimmed;\n}\n"],"mappings":"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","names":["timestamp"]}
|
|
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
UNKNOWN_PERMISSION_GRANT
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YY7SV2BZ.js";
|
|
7
7
|
import {
|
|
8
8
|
init_esm_shims
|
|
9
9
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -150,7 +150,7 @@ var FIREWALL_PERMISSION_METADATA_LOADERS = Object.assign(/* @__PURE__ */ Object.
|
|
|
150
150
|
return (await import("./clearbit.generated-Q2C5WCSZ.js"))["firewallPermissionMetadata"];
|
|
151
151
|
},
|
|
152
152
|
["clerk"]: async () => {
|
|
153
|
-
return (await import("./clerk.generated-
|
|
153
|
+
return (await import("./clerk.generated-ERU55NQP.js"))["firewallPermissionMetadata"];
|
|
154
154
|
},
|
|
155
155
|
["clickup"]: async () => {
|
|
156
156
|
return (await import("./clickup.generated-A54ZUSDN.js"))["firewallPermissionMetadata"];
|
|
@@ -225,7 +225,7 @@ var FIREWALL_PERMISSION_METADATA_LOADERS = Object.assign(/* @__PURE__ */ Object.
|
|
|
225
225
|
return (await import("./drive9.generated-KVIHF5FJ.js"))["firewallPermissionMetadata"];
|
|
226
226
|
},
|
|
227
227
|
["dropbox"]: async () => {
|
|
228
|
-
return (await import("./dropbox.generated-
|
|
228
|
+
return (await import("./dropbox.generated-ZZKEVL5X.js"))["firewallPermissionMetadata"];
|
|
229
229
|
},
|
|
230
230
|
["dropbox-sign"]: async () => {
|
|
231
231
|
return (await import("./dropbox-sign.generated-KGTXQ4VE.js"))["firewallPermissionMetadata"];
|
|
@@ -654,7 +654,7 @@ var FIREWALL_PERMISSION_METADATA_LOADERS = Object.assign(/* @__PURE__ */ Object.
|
|
|
654
654
|
return (await import("./sendgrid.generated-ZMVGPUUW.js"))["firewallPermissionMetadata"];
|
|
655
655
|
},
|
|
656
656
|
["sentry"]: async () => {
|
|
657
|
-
return (await import("./sentry.generated-
|
|
657
|
+
return (await import("./sentry.generated-Y3V3MFG5.js"))["firewallPermissionMetadata"];
|
|
658
658
|
},
|
|
659
659
|
["serpapi"]: async () => {
|
|
660
660
|
return (await import("./serpapi.generated-SLY4P6BG.js"))["firewallPermissionMetadata"];
|
|
@@ -705,7 +705,7 @@ var FIREWALL_PERMISSION_METADATA_LOADERS = Object.assign(/* @__PURE__ */ Object.
|
|
|
705
705
|
return (await import("./strapi.generated-IDNY7T2O.js"))["firewallPermissionMetadata"];
|
|
706
706
|
},
|
|
707
707
|
["strava"]: async () => {
|
|
708
|
-
return (await import("./strava.generated-
|
|
708
|
+
return (await import("./strava.generated-FDURULCZ.js"))["firewallPermissionMetadata"];
|
|
709
709
|
},
|
|
710
710
|
["streak"]: async () => {
|
|
711
711
|
return (await import("./streak.generated-Z4GE5KE2.js"))["firewallPermissionMetadata"];
|
|
@@ -789,7 +789,7 @@ var FIREWALL_PERMISSION_METADATA_LOADERS = Object.assign(/* @__PURE__ */ Object.
|
|
|
789
789
|
return (await import("./x.generated-HPR65YUK.js"))["firewallPermissionMetadata"];
|
|
790
790
|
},
|
|
791
791
|
["xero"]: async () => {
|
|
792
|
-
return (await import("./xero.generated-
|
|
792
|
+
return (await import("./xero.generated-NPSQE6GC.js"))["firewallPermissionMetadata"];
|
|
793
793
|
},
|
|
794
794
|
["youtube"]: async () => {
|
|
795
795
|
return (await import("./youtube.generated-WVCRGH3X.js"))["firewallPermissionMetadata"];
|
|
@@ -3089,4 +3089,4 @@ export {
|
|
|
3089
3089
|
resolveFirewallMetadataPolicies,
|
|
3090
3090
|
permissionGrantsToFirewallPolicies
|
|
3091
3091
|
};
|
|
3092
|
-
//# sourceMappingURL=chunk-
|
|
3092
|
+
//# sourceMappingURL=chunk-MY2ZR6YU.js.map
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __createRequire } from "node:module";
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
|
+
import {
|
|
5
|
+
parseBoundedLogCount,
|
|
6
|
+
parseSearchQuery,
|
|
7
|
+
parseTime
|
|
8
|
+
} from "./chunk-H63W4KQL.js";
|
|
4
9
|
import {
|
|
5
10
|
EventRenderer,
|
|
6
11
|
EventStreamNormalizer,
|
|
7
12
|
formatIsoTimestamp,
|
|
8
13
|
isSupportedFramework,
|
|
9
|
-
isUUID
|
|
10
|
-
|
|
11
|
-
parseSearchQuery,
|
|
12
|
-
parseTime
|
|
13
|
-
} from "./chunk-Q47FRJVT.js";
|
|
14
|
+
isUUID
|
|
15
|
+
} from "./chunk-CWBLSKVL.js";
|
|
14
16
|
import {
|
|
15
17
|
searchZeroLogs
|
|
16
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-YY7SV2BZ.js";
|
|
17
19
|
import {
|
|
18
20
|
withErrorHandler
|
|
19
21
|
} from "./chunk-3F4RFLPX.js";
|
|
@@ -176,4 +178,4 @@ export {
|
|
|
176
178
|
runLogsSearch,
|
|
177
179
|
searchCommand
|
|
178
180
|
};
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
181
|
+
//# sourceMappingURL=chunk-NI3BDNLY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/logs/search.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { EventStreamNormalizer } from \"../../../lib/events/event-stream-normalizer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isSupportedFramework } from \"@vm0/core/frameworks\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agentId?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\ninterface LogsSearchCommandOptions extends Omit<\n LogsSearchCliOptions,\n \"agentId\"\n> {\n agent?: string;\n}\n\nfunction supportedSearchFramework(\n framework: string | null | undefined,\n): string | undefined {\n const normalized = framework ?? undefined;\n return isSupportedFramework(normalized) ? normalized : undefined;\n}\n\nfunction renderSearchEvent(\n event: RunEvent,\n framework: string | null | undefined,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n supportedSearchFramework(framework),\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\nfunction flushSearchRenderer(\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n): void {\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n renderer.flush();\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = formatIsoTimestamp(timestamp);\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN =\n options.context !== undefined\n ? parseBoundedLogCount(options.context, \"--context\", 0, 10)\n : 0;\n const before =\n options.beforeContext !== undefined\n ? parseBoundedLogCount(options.beforeContext, \"--before-context\", 0, 10)\n : contextN;\n const after =\n options.afterContext !== undefined\n ? parseBoundedLogCount(options.afterContext, \"--after-context\", 0, 10)\n : contextN;\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n return parseBoundedLogCount(value, \"--limit\", 1, 50);\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n });\n const normalizer = new EventStreamNormalizer();\n\n for (const event of result.contextBefore) {\n renderSearchEvent(event, result.framework, renderer, normalizer);\n }\n renderSearchEvent(\n result.matchedEvent,\n result.framework,\n renderer,\n normalizer,\n );\n for (const event of result.contextAfter) {\n renderSearchEvent(event, result.framework, renderer, normalizer);\n }\n flushSearchRenderer(renderer, normalizer);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const searchKeyword = parseSearchQuery(keyword, \"Keyword\");\n const { before, after } = parseContextOptions(options);\n\n if (options.agentId !== undefined && !isUUID(options.agentId)) {\n console.error(\n chalk.red(`✗ Invalid agent ID \"${options.agentId}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find agent IDs\"));\n process.exit(1);\n }\n\n if (options.run !== undefined && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword: searchKeyword,\n agentId: options.agentId,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent 123e4567-e89b-12d3-a456-426614174000 -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: LogsSearchCommandOptions) => {\n const { agent, ...searchOptions } = options;\n await runLogsSearch(keyword, { ...searchOptions, agentId: agent });\n },\n ),\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/logs/search.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchZeroLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport { EventStreamNormalizer } from \"../../../lib/events/event-stream-normalizer\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isSupportedFramework } from \"@vm0/core/frameworks\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface LogsSearchCliOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agentId?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\ninterface LogsSearchCommandOptions extends Omit<\n LogsSearchCliOptions,\n \"agentId\"\n> {\n agent?: string;\n}\n\nfunction supportedSearchFramework(\n framework: string | null | undefined,\n): string | undefined {\n const normalized = framework ?? undefined;\n return isSupportedFramework(normalized) ? normalized : undefined;\n}\n\nfunction renderSearchEvent(\n event: RunEvent,\n framework: string | null | undefined,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n supportedSearchFramework(framework),\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\nfunction flushSearchRenderer(\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n): void {\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n renderer.flush();\n}\n\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const time = formatIsoTimestamp(timestamp);\n return `── Run ${runId} (${agentName}, ${time}) ──────────`;\n}\n\nfunction parseContextOptions(options: LogsSearchCliOptions): {\n before: number;\n after: number;\n} {\n const contextN =\n options.context !== undefined\n ? parseBoundedLogCount(options.context, \"--context\", 0, 10)\n : 0;\n const before =\n options.beforeContext !== undefined\n ? parseBoundedLogCount(options.beforeContext, \"--before-context\", 0, 10)\n : contextN;\n const after =\n options.afterContext !== undefined\n ? parseBoundedLogCount(options.afterContext, \"--after-context\", 0, 10)\n : contextN;\n\n return { before, after };\n}\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n return parseBoundedLogCount(value, \"--limit\", 1, 50);\n}\n\nfunction renderResults(response: LogsSearchResponse): void {\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log();\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n });\n const normalizer = new EventStreamNormalizer();\n\n for (const event of result.contextBefore) {\n renderSearchEvent(event, result.framework, renderer, normalizer);\n }\n renderSearchEvent(\n result.matchedEvent,\n result.framework,\n renderer,\n normalizer,\n );\n for (const event of result.contextAfter) {\n renderSearchEvent(event, result.framework, renderer, normalizer);\n }\n flushSearchRenderer(renderer, normalizer);\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport async function runLogsSearch(\n keyword: string,\n options: LogsSearchCliOptions,\n): Promise<void> {\n const searchKeyword = parseSearchQuery(keyword, \"Keyword\");\n const { before, after } = parseContextOptions(options);\n\n if (options.agentId !== undefined && !isUUID(options.agentId)) {\n console.error(\n chalk.red(`✗ Invalid agent ID \"${options.agentId}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find agent IDs\"));\n process.exit(1);\n }\n\n if (options.run !== undefined && !isUUID(options.run)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${options.run}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero logs list to find run IDs\"));\n process.exit(1);\n }\n\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchZeroLogs({\n keyword: searchKeyword,\n agentId: options.agentId,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs search \"error\"\n zero logs search \"timeout\" --agent 123e4567-e89b-12d3-a456-426614174000 -C 2\n zero logs search \"failed\" --since 30d --limit 50`,\n )\n .action(\n withErrorHandler(\n async (keyword: string, options: LogsSearchCommandOptions) => {\n const { agent, ...searchOptions } = options;\n await runLogsSearch(keyword, { ...searchOptions, agentId: agent });\n },\n ),\n );\n"],"mappings":"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","names":[]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
CONNECTOR_TYPES,
|
|
6
6
|
CONNECTOR_TYPE_KEYS,
|
|
7
7
|
connectorAuthMethodIdSchema
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-YY7SV2BZ.js";
|
|
9
9
|
import {
|
|
10
10
|
init_esm_shims
|
|
11
11
|
} from "./chunk-DIRAZ3YX.js";
|
|
@@ -181,4 +181,4 @@ export {
|
|
|
181
181
|
hasRequiredConnectorAuthMethodScopes,
|
|
182
182
|
getConnectorAuthMethodScopeDiff
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-VLGMCLXQ.js.map
|
|
@@ -830,6 +830,16 @@ function getSecretsForAuthMethod(type, authMethod) {
|
|
|
830
830
|
const method = authMethods[authMethod];
|
|
831
831
|
return method?.secrets;
|
|
832
832
|
}
|
|
833
|
+
var modelProviderSubscriptionUsageWindowSchema = external_exports.object({
|
|
834
|
+
usedPercent: external_exports.number().nullable(),
|
|
835
|
+
remainingPercent: external_exports.number().nullable(),
|
|
836
|
+
resetAt: external_exports.string().nullable(),
|
|
837
|
+
windowSeconds: external_exports.number().nullable()
|
|
838
|
+
});
|
|
839
|
+
var modelProviderSubscriptionUsageSchema = external_exports.object({
|
|
840
|
+
fiveHour: modelProviderSubscriptionUsageWindowSchema.nullable(),
|
|
841
|
+
weekly: modelProviderSubscriptionUsageWindowSchema.nullable()
|
|
842
|
+
});
|
|
833
843
|
var modelProviderResponseSchema = external_exports.object({
|
|
834
844
|
id: external_exports.uuid(),
|
|
835
845
|
type: modelProviderTypeSchema,
|
|
@@ -844,10 +854,15 @@ var modelProviderResponseSchema = external_exports.object({
|
|
|
844
854
|
selectedModel: external_exports.string().nullable(),
|
|
845
855
|
createdAt: external_exports.string(),
|
|
846
856
|
updatedAt: external_exports.string(),
|
|
847
|
-
//
|
|
848
|
-
//
|
|
857
|
+
// OAuth account metadata populated by provider-specific connect flows. Other
|
|
858
|
+
// provider types omit these.
|
|
849
859
|
workspaceName: external_exports.string().nullable().optional(),
|
|
850
860
|
planType: external_exports.string().nullable().optional(),
|
|
861
|
+
// Subscription quota metadata. Providers omit these until an upstream source
|
|
862
|
+
// exposes the reset cadence or next reset timestamp.
|
|
863
|
+
subscriptionResetPeriod: external_exports.string().nullable().optional(),
|
|
864
|
+
subscriptionNextResetAt: external_exports.string().nullable().optional(),
|
|
865
|
+
subscriptionUsage: modelProviderSubscriptionUsageSchema.nullable().optional(),
|
|
851
866
|
// OAuth refresh state. `needsReconnect` flips to true when the firewall's
|
|
852
867
|
// refresh attempt fails (#11921 writes this on the model_providers row).
|
|
853
868
|
// `lastRefreshErrorCode` carries the typed code from `ChatgptRefreshError`
|
|
@@ -24857,20 +24872,6 @@ async function getComposeByName(name) {
|
|
|
24857
24872
|
}
|
|
24858
24873
|
handleError(result, `Compose not found: ${name}`);
|
|
24859
24874
|
}
|
|
24860
|
-
var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
24861
|
-
async function resolveCompose(identifier) {
|
|
24862
|
-
if (UUID_PATTERN.test(identifier)) {
|
|
24863
|
-
try {
|
|
24864
|
-
return await getComposeById(identifier);
|
|
24865
|
-
} catch (error) {
|
|
24866
|
-
if (error instanceof ApiRequestError && error.status === 404) {
|
|
24867
|
-
return null;
|
|
24868
|
-
}
|
|
24869
|
-
throw error;
|
|
24870
|
-
}
|
|
24871
|
-
}
|
|
24872
|
-
return getComposeByName(identifier);
|
|
24873
|
-
}
|
|
24874
24875
|
async function getComposeById(id) {
|
|
24875
24876
|
const config = await getClientConfig();
|
|
24876
24877
|
const client = initClient(composesByIdContract, config);
|
|
@@ -27692,6 +27693,7 @@ export {
|
|
|
27692
27693
|
CONNECTOR_TYPES,
|
|
27693
27694
|
CONNECTOR_TYPE_KEYS,
|
|
27694
27695
|
connectorTypeSchema,
|
|
27696
|
+
connectorReconnectReasonSchema,
|
|
27695
27697
|
guaranteedConnectorProvidedBindingNames,
|
|
27696
27698
|
initContract,
|
|
27697
27699
|
authHeadersSchema,
|
|
@@ -27711,7 +27713,6 @@ export {
|
|
|
27711
27713
|
composeResponseSchema,
|
|
27712
27714
|
composeListItemSchema,
|
|
27713
27715
|
getComposeByName,
|
|
27714
|
-
resolveCompose,
|
|
27715
27716
|
getComposeById,
|
|
27716
27717
|
getComposeVersion,
|
|
27717
27718
|
createOrUpdateCompose,
|
|
@@ -27862,4 +27863,4 @@ export {
|
|
|
27862
27863
|
completeHostedSite,
|
|
27863
27864
|
getHostedSiteFiles
|
|
27864
27865
|
};
|
|
27865
|
-
//# sourceMappingURL=chunk-
|
|
27866
|
+
//# sourceMappingURL=chunk-YY7SV2BZ.js.map
|