@vm0/cli 9.219.0 → 9.220.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/{agent-4SQZDYYN.js → agent-7NASKRN2.js} +4 -4
- package/{automation-WPG4IYVE.js → automation-DL2TSVCY.js} +21 -11
- package/automation-DL2TSVCY.js.map +1 -0
- package/{banking-S7GOP6WI.js → banking-7766P2VA.js} +2 -2
- package/{chat-6E34QZHI.js → chat-7Y3GRRQU.js} +2 -2
- package/{chunk-NUCGXUQW.js → chunk-2WLLGU5G.js} +2 -2
- package/{chunk-UQBJX5J5.js → chunk-BDVHHGRQ.js} +7 -7
- package/{chunk-O5WIIYWN.js → chunk-CYWNKBCJ.js} +2 -2
- package/{chunk-B33JIZI2.js → chunk-EIORAGIM.js} +3 -3
- package/chunk-H63W4KQL.js +160 -0
- package/chunk-H63W4KQL.js.map +1 -0
- package/{chunk-7DWLR3AY.js → chunk-IP5MKNYO.js} +9 -7
- package/{chunk-7DWLR3AY.js.map → chunk-IP5MKNYO.js.map} +1 -1
- package/{chunk-RYGMBENC.js → chunk-JJNOLW3F.js} +2 -2
- package/{chunk-Q47FRJVT.js → chunk-MES7TURQ.js} +51 -182
- package/chunk-MES7TURQ.js.map +1 -0
- package/{chunk-C3NCF7AC.js → chunk-PHLVIRTN.js} +56 -29
- package/chunk-PHLVIRTN.js.map +1 -0
- package/{chunk-PTXI3X6L.js → chunk-QCBHUHCP.js} +2 -2
- package/clerk.generated-ERU55NQP.js +402 -0
- package/clerk.generated-ERU55NQP.js.map +1 -0
- package/{computer-use-P5NZISFJ.js → computer-use-DFWKRS5C.js} +2 -2
- package/{connector-BF7GN5KJ.js → connector-XXMPNPPI.js} +3 -3
- package/{credit-MUMH2AFQ.js → credit-EXQA2ZKH.js} +2 -2
- package/{developer-support-YRODRFDP.js → developer-support-HV2KNBFK.js} +2 -2
- package/{doctor-SYQVWI4X.js → doctor-B3XKCTAQ.js} +5 -5
- package/dropbox.generated-ZZKEVL5X.js +140 -0
- package/dropbox.generated-ZZKEVL5X.js.map +1 -0
- package/{generate-SOTMY5L2.js → generate-76KZOWWD.js} +3 -3
- package/{github-M5QMAGUR.js → github-R33X2DZP.js} +2 -2
- package/{goal-UCWUNBDX.js → goal-6EHEH3W6.js} +2 -2
- package/{host-FBIUSQM5.js → host-QJVQWPTD.js} +2 -2
- package/index.js +20 -18
- package/index.js.map +1 -1
- package/{logs-2WS7C3NG.js → logs-TP25S725.js} +13 -11
- package/{logs-2WS7C3NG.js.map → logs-TP25S725.js.map} +1 -1
- package/{maps-F6HS3TX3.js → maps-GGAFUIRJ.js} +2 -2
- package/{model-WVSFDOUB.js → model-B3IPEBEY.js} +3 -3
- package/{model-provider-RW5KSE2A.js → model-provider-3AKAPHTA.js} +3 -3
- package/{org-HG7QC6H2.js → org-LCUQ4U3K.js} +2 -2
- package/package.json +1 -1
- package/{phone-Y53A3YR6.js → phone-3PZOGXP5.js} +2 -2
- package/{preference-PDDNKSID.js → preference-7BNRZYGT.js} +2 -2
- package/{resource-4RXH7SID.js → resource-FYGZW3VK.js} +2 -2
- package/{schedule-XUGLVIVF.js → schedule-MTI5OP23.js} +2 -2
- package/schedule-MTI5OP23.js.map +1 -0
- package/{search-NRX5C4BZ.js → search-G5335REW.js} +10 -8
- package/{search-NRX5C4BZ.js.map → search-G5335REW.js.map} +1 -1
- package/{secret-G6ZROM3S.js → secret-DPVN2UF2.js} +3 -3
- package/sentry.generated-Y3V3MFG5.js +112 -0
- package/sentry.generated-Y3V3MFG5.js.map +1 -0
- package/{slack-UE7PHE5Q.js → slack-T7G7IOD7.js} +2 -2
- package/strava.generated-FDURULCZ.js +76 -0
- package/strava.generated-FDURULCZ.js.map +1 -0
- package/{telegram-FMO5JNQL.js → telegram-AIUOTF4A.js} +2 -2
- package/{variable-3QU5KSPD.js → variable-UNXSGRUU.js} +2 -2
- package/{web-NUS7HONQ.js → web-NX3LRDTP.js} +2 -2
- package/{whoami-BVBVPCEX.js → whoami-W6ZRUGTN.js} +4 -4
- package/{workflow-KFXYP54E.js → workflow-F2YOTCAJ.js} +135 -95
- package/workflow-F2YOTCAJ.js.map +1 -0
- 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/workflow-KFXYP54E.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-7NASKRN2.js.map} +0 -0
- /package/{banking-S7GOP6WI.js.map → banking-7766P2VA.js.map} +0 -0
- /package/{chat-6E34QZHI.js.map → chat-7Y3GRRQU.js.map} +0 -0
- /package/{chunk-NUCGXUQW.js.map → chunk-2WLLGU5G.js.map} +0 -0
- /package/{chunk-UQBJX5J5.js.map → chunk-BDVHHGRQ.js.map} +0 -0
- /package/{chunk-O5WIIYWN.js.map → chunk-CYWNKBCJ.js.map} +0 -0
- /package/{chunk-B33JIZI2.js.map → chunk-EIORAGIM.js.map} +0 -0
- /package/{chunk-RYGMBENC.js.map → chunk-JJNOLW3F.js.map} +0 -0
- /package/{chunk-PTXI3X6L.js.map → chunk-QCBHUHCP.js.map} +0 -0
- /package/{computer-use-P5NZISFJ.js.map → computer-use-DFWKRS5C.js.map} +0 -0
- /package/{connector-BF7GN5KJ.js.map → connector-XXMPNPPI.js.map} +0 -0
- /package/{credit-MUMH2AFQ.js.map → credit-EXQA2ZKH.js.map} +0 -0
- /package/{developer-support-YRODRFDP.js.map → developer-support-HV2KNBFK.js.map} +0 -0
- /package/{doctor-SYQVWI4X.js.map → doctor-B3XKCTAQ.js.map} +0 -0
- /package/{generate-SOTMY5L2.js.map → generate-76KZOWWD.js.map} +0 -0
- /package/{github-M5QMAGUR.js.map → github-R33X2DZP.js.map} +0 -0
- /package/{goal-UCWUNBDX.js.map → goal-6EHEH3W6.js.map} +0 -0
- /package/{host-FBIUSQM5.js.map → host-QJVQWPTD.js.map} +0 -0
- /package/{maps-F6HS3TX3.js.map → maps-GGAFUIRJ.js.map} +0 -0
- /package/{model-WVSFDOUB.js.map → model-B3IPEBEY.js.map} +0 -0
- /package/{model-provider-RW5KSE2A.js.map → model-provider-3AKAPHTA.js.map} +0 -0
- /package/{org-HG7QC6H2.js.map → org-LCUQ4U3K.js.map} +0 -0
- /package/{phone-Y53A3YR6.js.map → phone-3PZOGXP5.js.map} +0 -0
- /package/{preference-PDDNKSID.js.map → preference-7BNRZYGT.js.map} +0 -0
- /package/{resource-4RXH7SID.js.map → resource-FYGZW3VK.js.map} +0 -0
- /package/{secret-G6ZROM3S.js.map → secret-DPVN2UF2.js.map} +0 -0
- /package/{slack-UE7PHE5Q.js.map → slack-T7G7IOD7.js.map} +0 -0
- /package/{telegram-FMO5JNQL.js.map → telegram-AIUOTF4A.js.map} +0 -0
- /package/{variable-3QU5KSPD.js.map → variable-UNXSGRUU.js.map} +0 -0
- /package/{web-NUS7HONQ.js.map → web-NX3LRDTP.js.map} +0 -0
- /package/{whoami-BVBVPCEX.js.map → whoami-W6ZRUGTN.js.map} +0 -0
|
@@ -4,10 +4,10 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
loadConnectorPermissionInfos,
|
|
6
6
|
policyIcon
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2WLLGU5G.js";
|
|
8
8
|
import {
|
|
9
9
|
permissionGrantsToFirewallPolicies
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-BDVHHGRQ.js";
|
|
11
11
|
import {
|
|
12
12
|
isInteractive,
|
|
13
13
|
promptConfirm
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
listZeroUserPermissionGrants,
|
|
25
25
|
updateZeroAgent,
|
|
26
26
|
updateZeroAgentInstructions
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-PHLVIRTN.js";
|
|
28
28
|
import {
|
|
29
29
|
withErrorHandler
|
|
30
30
|
} from "./chunk-3F4RFLPX.js";
|
|
@@ -595,4 +595,4 @@ Notes:
|
|
|
595
595
|
export {
|
|
596
596
|
zeroAgentCommand
|
|
597
597
|
};
|
|
598
|
-
//# sourceMappingURL=agent-
|
|
598
|
+
//# sourceMappingURL=agent-7NASKRN2.js.map
|
|
@@ -8,6 +8,12 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
formatRelativeTime
|
|
10
10
|
} from "./chunk-RGP625TN.js";
|
|
11
|
+
import {
|
|
12
|
+
isUUID
|
|
13
|
+
} from "./chunk-MES7TURQ.js";
|
|
14
|
+
import "./chunk-7HZXC5CL.js";
|
|
15
|
+
import "./chunk-QCBHUHCP.js";
|
|
16
|
+
import "./chunk-CYWNKBCJ.js";
|
|
11
17
|
import {
|
|
12
18
|
isInteractive,
|
|
13
19
|
promptConfirm
|
|
@@ -18,13 +24,13 @@ import {
|
|
|
18
24
|
deleteAutomation,
|
|
19
25
|
disableAutomation,
|
|
20
26
|
enableAutomation,
|
|
27
|
+
getComposeById,
|
|
21
28
|
listAutomations,
|
|
22
|
-
resolveCompose,
|
|
23
29
|
runAutomation,
|
|
24
30
|
showAutomation,
|
|
25
31
|
updateAutomation,
|
|
26
32
|
updateAutomationTrigger
|
|
27
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-PHLVIRTN.js";
|
|
28
34
|
import {
|
|
29
35
|
withErrorHandler
|
|
30
36
|
} from "./chunk-3F4RFLPX.js";
|
|
@@ -154,7 +160,7 @@ function buildInlineTrigger(options) {
|
|
|
154
160
|
}
|
|
155
161
|
throw new Error("Use exactly one of --cron, --once, --loop");
|
|
156
162
|
}
|
|
157
|
-
var createCommand = new Command().name("create").description("Create an automation with a schedule trigger").requiredOption("-n, --name <name>", "Automation name").requiredOption("--agent <id>", "Agent ID
|
|
163
|
+
var createCommand = new Command().name("create").description("Create an automation with a schedule trigger").requiredOption("-n, --name <name>", "Automation name").requiredOption("--agent <agent-id>", "Agent ID to run").requiredOption(
|
|
158
164
|
"-p, --prompt <instruction>",
|
|
159
165
|
"Instruction the agent runs when the automation fires"
|
|
160
166
|
).option("--description <text>", "Optional description").option("--cron <expression>", 'Add a cron trigger (e.g. "0 9 * * *")').option(
|
|
@@ -164,19 +170,23 @@ var createCommand = new Command().name("create").description("Create an automati
|
|
|
164
170
|
"after",
|
|
165
171
|
`
|
|
166
172
|
Examples:
|
|
167
|
-
Daily at 9am: zero automation create -n alerts --agent
|
|
168
|
-
One-time: zero automation create -n alerts --agent
|
|
169
|
-
Every 15 min: zero automation create -n alerts --agent
|
|
173
|
+
Daily at 9am: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p "..." --cron "0 9 * * *"
|
|
174
|
+
One-time: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p "..." --once "2026-06-10T09:00" -z UTC
|
|
175
|
+
Every 15 min: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p "..." --loop 15m
|
|
170
176
|
|
|
171
177
|
Notes:
|
|
172
178
|
- Exactly one of --cron, --once, --loop is required`
|
|
173
179
|
).action(
|
|
174
180
|
withErrorHandler(async (options) => {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
181
|
+
if (!isUUID(options.agent)) {
|
|
182
|
+
console.error(
|
|
183
|
+
source_default.red(`\u2717 Invalid agent ID "${options.agent}" \u2014 expected a UUID`)
|
|
184
|
+
);
|
|
185
|
+
console.error(source_default.dim(" Run: zero agent list to find agent IDs"));
|
|
186
|
+
process.exit(1);
|
|
179
187
|
}
|
|
188
|
+
const trigger = buildInlineTrigger(options);
|
|
189
|
+
const compose = await getComposeById(options.agent);
|
|
180
190
|
const { automation } = await createAutomation({
|
|
181
191
|
name: options.name,
|
|
182
192
|
agentId: compose.id,
|
|
@@ -490,4 +500,4 @@ Examples:
|
|
|
490
500
|
export {
|
|
491
501
|
zeroAutomationCommand
|
|
492
502
|
};
|
|
493
|
-
//# sourceMappingURL=automation-
|
|
503
|
+
//# sourceMappingURL=automation-DL2TSVCY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/automation/index.ts","../src/commands/zero/automation/create.ts","../src/commands/zero/automation/at-time-input.ts","../src/commands/zero/automation/trigger-display.ts","../src/commands/zero/automation/list.ts","../src/commands/zero/automation/show.ts","../src/commands/zero/automation/update.ts","../src/commands/zero/automation/delete.ts","../src/commands/zero/automation/enable.ts","../src/commands/zero/automation/disable.ts","../src/commands/zero/automation/run.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { createCommand } from \"./create\";\nimport { listCommand } from \"./list\";\nimport { showCommand } from \"./show\";\nimport { updateCommand } from \"./update\";\nimport { deleteCommand } from \"./delete\";\nimport { enableCommand } from \"./enable\";\nimport { disableCommand } from \"./disable\";\nimport { runCommand } from \"./run\";\n\nexport const zeroAutomationCommand = new Command()\n .name(\"automation\")\n .description(\"Create or manage scheduled automations\")\n .addCommand(createCommand)\n .addCommand(listCommand)\n .addCommand(showCommand)\n .addCommand(updateCommand)\n .addCommand(deleteCommand)\n .addCommand(enableCommand)\n .addCommand(disableCommand)\n .addCommand(runCommand)\n // Deprecated aliases — fully functional, but print a stderr notice pointing\n // at the replacement command.\n .addHelpText(\n \"after\",\n `\nExamples:\n Create an automation: zero automation create -n alerts --agent <agent-id> -p \"Summarize alerts\" --cron \"0 9 * * *\"\n List automations: zero automation list\n Inspect one: zero automation show alerts\n Fire manually: zero automation run alerts\n Pause an automation: zero automation disable alerts\n Resume an automation: zero automation enable alerts\n Delete an automation: zero automation delete alerts`,\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { CreateTriggerRequest } from \"@vm0/api-contracts/contracts/automations\";\nimport { createAutomation, getComposeById } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { requireTimezoneForLocalAtTime } from \"./at-time-input\";\nimport { parseDurationSeconds } from \"./duration\";\nimport { formatTriggerConfig } from \"./trigger-display\";\n\ninterface CreateOptions {\n name: string;\n agent: string;\n prompt: string;\n description?: string;\n cron?: string;\n once?: string;\n loop?: string;\n timezone?: string;\n}\n\n/**\n * Build the automation schedule trigger from exactly one inline flag\n * (--cron / --once / --loop, with optional --timezone).\n */\nfunction buildInlineTrigger(options: CreateOptions): CreateTriggerRequest {\n const sugarCount = [options.cron, options.once, options.loop].filter(\n (value) => {\n return value !== undefined;\n },\n ).length;\n\n if (sugarCount !== 1) {\n throw new Error(\"Use exactly one of --cron, --once, --loop\");\n }\n\n if (options.timezone && !options.cron && !options.once) {\n throw new Error(\"--timezone requires --cron or --once\");\n }\n\n if (options.cron) {\n return {\n kind: \"cron\",\n cronExpression: options.cron,\n timezone: options.timezone,\n };\n }\n if (options.once) {\n requireTimezoneForLocalAtTime(options.once, options.timezone, \"--once\");\n return { kind: \"once\", atTime: options.once, timezone: options.timezone };\n }\n if (options.loop) {\n return {\n kind: \"loop\",\n intervalSeconds: parseDurationSeconds(options.loop),\n };\n }\n throw new Error(\"Use exactly one of --cron, --once, --loop\");\n}\n\nexport const createCommand = new Command()\n .name(\"create\")\n .description(\"Create an automation with a schedule trigger\")\n .requiredOption(\"-n, --name <name>\", \"Automation name\")\n .requiredOption(\"--agent <agent-id>\", \"Agent ID to run\")\n .requiredOption(\n \"-p, --prompt <instruction>\",\n \"Instruction the agent runs when the automation fires\",\n )\n .option(\"--description <text>\", \"Optional description\")\n .option(\"--cron <expression>\", 'Add a cron trigger (e.g. \"0 9 * * *\")')\n .option(\n \"--once <iso-time>\",\n 'Add a one-time trigger (e.g. \"2026-06-10T09:00\")',\n )\n .option(\"--loop <duration>\", \"Add a loop trigger (e.g. 15m, 1h, 90s)\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone for --cron / --once\")\n .addHelpText(\n \"after\",\n `\nExamples:\n Daily at 9am: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p \"...\" --cron \"0 9 * * *\"\n One-time: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p \"...\" --once \"2026-06-10T09:00\" -z UTC\n Every 15 min: zero automation create -n alerts --agent 550e8400-e29b-41d4-a716-446655440000 -p \"...\" --loop 15m\n\nNotes:\n - Exactly one of --cron, --once, --loop is required`,\n )\n .action(\n withErrorHandler(async (options: CreateOptions) => {\n if (!isUUID(options.agent)) {\n console.error(\n chalk.red(`✗ Invalid agent ID \"${options.agent}\" — expected a UUID`),\n );\n console.error(chalk.dim(\" Run: zero agent list to find agent IDs\"));\n process.exit(1);\n }\n\n const trigger = buildInlineTrigger(options);\n\n const compose = await getComposeById(options.agent);\n\n const { automation } = await createAutomation({\n name: options.name,\n agentId: compose.id,\n instruction: options.prompt,\n description: options.description,\n chatThreadId: process.env.ZERO_CHAT_THREAD_ID,\n trigger,\n });\n\n console.log(chalk.green(`✓ Automation \"${automation.name}\" created`));\n console.log(chalk.dim(` ID: ${automation.id}`));\n console.log(chalk.dim(` Agent: ${compose.name}`));\n console.log(chalk.dim(` Thread: ${automation.chatThreadId}`));\n\n const createdTrigger = automation.triggers[0];\n if (createdTrigger) {\n console.log(\n chalk.dim(\n ` Trigger: ${createdTrigger.kind} ${formatTriggerConfig(createdTrigger)} (${createdTrigger.id})`,\n ),\n );\n }\n\n console.log();\n console.log(\n ` Run manually: ${chalk.cyan(`zero automation run ${automation.name}`)}`,\n );\n }),\n );\n","const EXPLICIT_OFFSET_RE = /(?:[zZ]|[+-]\\d{2}:?\\d{2})$/u;\n\nfunction hasExplicitAtTimeOffset(atTime: string): boolean {\n return EXPLICIT_OFFSET_RE.test(atTime.trim());\n}\n\nexport function requireTimezoneForLocalAtTime(\n atTime: string,\n timezone: string | undefined,\n flagName: \"--at\" | \"--once\",\n): void {\n if (timezone || hasExplicitAtTimeOffset(atTime)) {\n return;\n }\n throw new Error(\n `${flagName} without Z or an explicit offset requires --timezone (e.g. ${flagName} \"2026-06-10T09:00\" --timezone Asia/Shanghai)`,\n );\n}\n","import chalk from \"chalk\";\nimport type { AutomationTriggerResponse } from \"@vm0/api-contracts/contracts/automations\";\nimport { formatRelativeTime } from \"../../../lib/domain/schedule-utils\";\nimport { formatDurationSeconds } from \"./duration\";\n\n/**\n * Shared rendering for an automation's schedule trigger.\n */\n\n/** One-line config summary per trigger kind. */\nexport function formatTriggerConfig(\n trigger: AutomationTriggerResponse,\n): string {\n switch (trigger.kind) {\n case \"cron\":\n return `${trigger.cronExpression} (${trigger.timezone})`;\n case \"once\":\n return `at ${trigger.atTime} (${trigger.timezone})`;\n case \"loop\":\n return `every ${formatDurationSeconds(trigger.intervalSeconds)}`;\n }\n}\n\nfunction formatNextRun(trigger: AutomationTriggerResponse): string {\n if (!trigger.nextRunAt) {\n return chalk.dim(\"-\");\n }\n return formatRelativeTime(trigger.nextRunAt);\n}\n\n/**\n * Print the triggers table: KIND, ID, STATUS, CONFIG, NEXT RUN\n */\nexport function printTriggersTable(\n triggers: readonly AutomationTriggerResponse[],\n): void {\n const kindWidth = Math.max(\n 4,\n ...triggers.map((t) => {\n return t.kind.length;\n }),\n );\n const idWidth = Math.max(\n 2,\n ...triggers.map((t) => {\n return t.id.length;\n }),\n );\n const configWidth = Math.max(\n 6,\n ...triggers.map((t) => {\n return formatTriggerConfig(t).length;\n }),\n );\n\n console.log(\n chalk.dim(\n [\n \"KIND\".padEnd(kindWidth),\n \"ID\".padEnd(idWidth),\n \"STATUS\".padEnd(8),\n \"CONFIG\".padEnd(configWidth),\n \"NEXT RUN\",\n ].join(\" \"),\n ),\n );\n\n for (const trigger of triggers) {\n const status = trigger.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(\n [\n trigger.kind.padEnd(kindWidth),\n trigger.id.padEnd(idWidth),\n status.padEnd(8 + (trigger.enabled ? 0 : 2)),\n formatTriggerConfig(trigger).padEnd(configWidth),\n formatNextRun(trigger),\n ].join(\" \"),\n );\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { AutomationResponse } from \"@vm0/api-contracts/contracts/automations\";\nimport { listAutomations } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nfunction formatTriggerSummary(automation: AutomationResponse): string {\n const [trigger] = automation.triggers;\n if (!trigger) {\n return chalk.dim(\"-\");\n }\n return trigger.kind;\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List automations with their schedule trigger\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation list`,\n )\n .action(\n withErrorHandler(async () => {\n const { automations } = await listAutomations();\n\n if (automations.length === 0) {\n console.log(chalk.dim(\"No automations found\"));\n console.log(\n chalk.dim(\n ' Create one with: zero automation create -n <name> --agent <agent-id> -p \"<instruction>\"',\n ),\n );\n return;\n }\n\n const nameWidth = Math.max(\n 4,\n ...automations.map((a) => {\n return a.name.length;\n }),\n );\n const idWidth = Math.max(\n 2,\n ...automations.map((a) => {\n return a.id.length;\n }),\n );\n const agentWidth = Math.max(\n 5,\n ...automations.map((a) => {\n return (a.displayName ?? a.agentId).length;\n }),\n );\n\n console.log(\n chalk.dim(\n [\n \"NAME\".padEnd(nameWidth),\n \"ID\".padEnd(idWidth),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(8),\n \"TRIGGER\",\n ].join(\" \"),\n ),\n );\n\n for (const automation of automations) {\n const status = automation.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n console.log(\n [\n automation.name.padEnd(nameWidth),\n automation.id.padEnd(idWidth),\n (automation.displayName ?? automation.agentId).padEnd(agentWidth),\n status.padEnd(8 + (automation.enabled ? 0 : 2)),\n formatTriggerSummary(automation),\n ].join(\" \"),\n );\n }\n\n console.log();\n console.log(\n chalk.dim(` Details: zero automation show <automation-name-or-id>`),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { showAutomation } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { printTriggersTable } from \"./trigger-display\";\n\nexport const showCommand = new Command()\n .name(\"show\")\n .description(\"Show an automation and its schedule\")\n .argument(\"<automation>\", \"Automation ID or name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation show alerts\n zero automation show 11111111-1111-4111-8111-111111111111\n\nNotes:\n - When the same name exists on multiple agents, the API rejects it as ambiguous — use the ID`,\n )\n .action(\n withErrorHandler(async (ref: string) => {\n const automation = await showAutomation(ref);\n\n const status = automation.enabled\n ? chalk.green(\"enabled\")\n : chalk.yellow(\"disabled\");\n const agent = automation.displayName\n ? `${automation.displayName} ${chalk.dim(`(${automation.agentId})`)}`\n : automation.agentId;\n\n console.log(`${\"Name:\".padEnd(14)}${automation.name}`);\n console.log(`${\"ID:\".padEnd(14)}${automation.id}`);\n console.log(`${\"Agent:\".padEnd(14)}${agent}`);\n console.log(`${\"Status:\".padEnd(14)}${status}`);\n if (automation.description) {\n console.log(`${\"Description:\".padEnd(14)}${automation.description}`);\n }\n console.log(\n `${\"Instruction:\".padEnd(14)}${chalk.dim(automation.instruction)}`,\n );\n console.log(`${\"Thread:\".padEnd(14)}${automation.chatThreadId}`);\n\n console.log();\n const [trigger] = automation.triggers;\n if (!trigger) {\n console.log(chalk.dim(\"No schedule trigger\"));\n return;\n }\n\n printTriggersTable([trigger]);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport type { UpdateTriggerRequest } from \"@vm0/api-contracts/contracts/automations\";\nimport {\n showAutomation,\n updateAutomation,\n updateAutomationTrigger,\n} from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { requireTimezoneForLocalAtTime } from \"./at-time-input\";\nimport { parseDurationSeconds } from \"./duration\";\nimport { formatTriggerConfig } from \"./trigger-display\";\n\ninterface UpdateOptions {\n name?: string;\n prompt?: string;\n description?: string;\n cron?: string;\n once?: string;\n loop?: string;\n timezone?: string;\n}\n\n/**\n * Build the optional schedule replacement from the timing sugar flags\n * (--cron / --once / --loop, with optional --timezone). The automation's\n * single time trigger is updated in place; its kind switches to match the\n * flag.\n */\nfunction buildTimingUpdate(\n options: UpdateOptions,\n): UpdateTriggerRequest | undefined {\n const sugarCount = [options.cron, options.once, options.loop].filter(\n (value) => {\n return value !== undefined;\n },\n ).length;\n\n if (sugarCount > 1) {\n throw new Error(\"Use at most one of --cron, --once, --loop\");\n }\n\n if (options.timezone && !options.cron && !options.once) {\n throw new Error(\"--timezone requires --cron or --once\");\n }\n\n if (options.cron) {\n return {\n kind: \"cron\",\n cronExpression: options.cron,\n timezone: options.timezone,\n };\n }\n if (options.once) {\n requireTimezoneForLocalAtTime(options.once, options.timezone, \"--once\");\n return { kind: \"once\", atTime: options.once, timezone: options.timezone };\n }\n if (options.loop) {\n return {\n kind: \"loop\",\n intervalSeconds: parseDurationSeconds(options.loop),\n };\n }\n return undefined;\n}\n\nexport const updateCommand = new Command()\n .name(\"update\")\n .description(\n \"Update an automation's name, instruction, description, or schedule\",\n )\n .argument(\"<automation>\", \"Automation ID or name\")\n .option(\"-n, --name <name>\", \"New automation name\")\n .option(\"-p, --prompt <instruction>\", \"New instruction\")\n .option(\"--description <text>\", \"New description\")\n .option(\"--cron <expression>\", 'New cron schedule (e.g. \"0 9 * * *\")')\n .option(\"--once <iso-time>\", 'New one-time fire (e.g. \"2026-06-10T09:00\")')\n .option(\"--loop <duration>\", \"New loop interval (e.g. 15m, 1h, 90s)\")\n .option(\"-z, --timezone <tz>\", \"IANA timezone for --cron / --once\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation update alerts -p \"Summarize alerts and post to Slack\"\n zero automation update alerts -n alerts-v2 --description \"Daily alert digest\"\n zero automation update alerts --cron \"0 18 * * 5\" -z Asia/Shanghai\n zero automation update alerts --loop 10m\n\nNotes:\n - At most one of --cron, --once, --loop; it replaces the automation's schedule trigger in place (the kind may switch, run history is kept)`,\n )\n .action(\n withErrorHandler(async (ref: string, options: UpdateOptions) => {\n const timing = buildTimingUpdate(options);\n const hasIdentityUpdate =\n options.name !== undefined ||\n options.prompt !== undefined ||\n options.description !== undefined;\n\n if (!hasIdentityUpdate && !timing) {\n throw new Error(\n \"Nothing to update: provide --name, --prompt, --description, --cron, --once, or --loop\",\n );\n }\n\n // Resolve the single trigger up front so a missing/ambiguous trigger\n // fails before any field is patched.\n let timeTriggerId: string | undefined;\n if (timing) {\n const automation = await showAutomation(ref);\n const timeTriggers = automation.triggers;\n const [first] = timeTriggers;\n if (!first) {\n throw new Error(`Automation ${ref} has no schedule trigger`);\n }\n timeTriggerId = first.id;\n }\n\n if (hasIdentityUpdate) {\n const automation = await updateAutomation(ref, {\n name: options.name,\n instruction: options.prompt,\n description: options.description,\n });\n console.log(chalk.green(`✓ Automation \"${automation.name}\" updated`));\n }\n\n if (timing && timeTriggerId) {\n const trigger = await updateAutomationTrigger(timeTriggerId, timing);\n console.log(chalk.green(`✓ Trigger ${trigger.id} updated`));\n console.log(\n chalk.dim(\n ` Schedule: ${trigger.kind} ${formatTriggerConfig(trigger)}`,\n ),\n );\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { deleteAutomation } from \"../../../lib/api\";\nimport { isInteractive, promptConfirm } from \"../../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const deleteCommand = new Command()\n .name(\"delete\")\n .alias(\"rm\")\n .description(\"Delete an automation (its triggers are removed too)\")\n .argument(\"<automation>\", \"Automation ID or name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation delete alerts\n zero automation delete alerts -y\n\nNotes:\n - Use -y to skip confirmation in non-interactive mode`,\n )\n .action(\n withErrorHandler(async (ref: string, options: { yes?: boolean }) => {\n if (!options.yes) {\n if (!isInteractive()) {\n throw new Error(\"--yes flag is required in non-interactive mode\");\n }\n const confirmed = await promptConfirm(\n `Delete automation ${chalk.cyan(ref)} and its schedule trigger?`,\n false,\n );\n if (!confirmed) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n }\n\n await deleteAutomation(ref);\n\n console.log(chalk.green(`✓ Automation \"${ref}\" deleted`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { enableAutomation } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const enableCommand = new Command()\n .name(\"enable\")\n .description(\"Enable an automation\")\n .argument(\"<automation>\", \"Automation ID or name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation enable alerts`,\n )\n .action(\n withErrorHandler(async (ref: string) => {\n const automation = await enableAutomation(ref);\n\n console.log(chalk.green(`✓ Automation \"${automation.name}\" enabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { disableAutomation } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const disableCommand = new Command()\n .name(\"disable\")\n .description(\"Disable an automation\")\n .argument(\"<automation>\", \"Automation ID or name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation disable alerts`,\n )\n .action(\n withErrorHandler(async (ref: string) => {\n const automation = await disableAutomation(ref);\n\n console.log(chalk.green(`✓ Automation \"${automation.name}\" disabled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { runAutomation } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nexport const runCommand = new Command()\n .name(\"run\")\n .description(\"Manually fire an automation (runs its instruction once)\")\n .argument(\"<automation>\", \"Automation ID or name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero automation run alerts`,\n )\n .action(\n withErrorHandler(async (ref: string) => {\n const { runId } = await runAutomation(ref);\n\n console.log(chalk.green(`✓ Automation \"${ref}\" fired`));\n console.log(chalk.dim(` Run ID: ${runId}`));\n }),\n );\n"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import "./chunk-LTDQISD7.js";
|
|
5
5
|
import {
|
|
6
6
|
callZeroBanking
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-PHLVIRTN.js";
|
|
8
8
|
import {
|
|
9
9
|
withErrorHandler
|
|
10
10
|
} from "./chunk-3F4RFLPX.js";
|
|
@@ -115,4 +115,4 @@ Notes:
|
|
|
115
115
|
export {
|
|
116
116
|
zeroBankingCommand
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=banking-
|
|
118
|
+
//# sourceMappingURL=banking-7766P2VA.js.map
|
|
@@ -5,7 +5,7 @@ import "./chunk-LTDQISD7.js";
|
|
|
5
5
|
import {
|
|
6
6
|
getZeroChatThread,
|
|
7
7
|
renameZeroChatThread
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-PHLVIRTN.js";
|
|
9
9
|
import {
|
|
10
10
|
withErrorHandler
|
|
11
11
|
} from "./chunk-3F4RFLPX.js";
|
|
@@ -120,4 +120,4 @@ Examples:
|
|
|
120
120
|
export {
|
|
121
121
|
zeroChatCommand
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=chat-
|
|
123
|
+
//# sourceMappingURL=chat-7Y3GRRQU.js.map
|
|
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
|
|
|
4
4
|
import {
|
|
5
5
|
loadFirewallPermissionMetadata,
|
|
6
6
|
resolveFirewallMetadataPolicies
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-BDVHHGRQ.js";
|
|
8
8
|
import {
|
|
9
9
|
source_default
|
|
10
10
|
} from "./chunk-JUTUEPIR.js";
|
|
@@ -87,4 +87,4 @@ export {
|
|
|
87
87
|
policyIcon,
|
|
88
88
|
loadConnectorPermissionInfos
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-2WLLGU5G.js.map
|
|
@@ -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-PHLVIRTN.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-BDVHHGRQ.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
CONNECTOR_TYPES,
|
|
6
6
|
CONNECTOR_TYPE_KEYS,
|
|
7
7
|
connectorAuthMethodIdSchema
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-PHLVIRTN.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-CYWNKBCJ.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.
|
|
53
|
+
release: "9.220.0",
|
|
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.
|
|
72
|
+
version: "9.220.0",
|
|
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-EIORAGIM.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"]}
|
|
@@ -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-MES7TURQ.js";
|
|
14
16
|
import {
|
|
15
17
|
searchZeroLogs
|
|
16
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-PHLVIRTN.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-IP5MKNYO.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAiBA,IAAM,gBAAgB,IAAI,KAAK,KAAK,KAAK;AAmBzC,SAAS,yBACP,WACoB;AACpB,QAAM,aAAa,aAAa;AAChC,SAAO,qBAAqB,UAAU,IAAI,aAAa;AACzD;AAEA,SAAS,kBACP,OACA,WACA,UACA,YACM;AACN,QAAM,eAAe,WAAW;AAAA,IAC9B,MAAM;AAAA,IACN,yBAAyB,SAAS;AAAA,IAClC,IAAI,KAAK,MAAM,SAAS;AAAA,EAC1B;AACA,aAAW,UAAU,cAAc;AACjC,aAAS,OAAO,MAAM;AAAA,EACxB;AACF;AAEA,SAAS,oBACP,UACA,YACM;AACN,aAAW,UAAU,WAAW,MAAM,GAAG;AACvC,aAAS,OAAO,MAAM;AAAA,EACxB;AACA,WAAS,MAAM;AACjB;AAEA,SAAS,gBACP,OACA,WACA,WACQ;AACR,QAAM,OAAO,mBAAmB,SAAS;AACzC,SAAO,oBAAU,KAAK,KAAK,SAAS,KAAK,IAAI;AAC/C;AAEA,SAAS,oBAAoB,SAG3B;AACA,QAAM,WACJ,QAAQ,YAAY,SAChB,qBAAqB,QAAQ,SAAS,aAAa,GAAG,EAAE,IACxD;AACN,QAAM,SACJ,QAAQ,kBAAkB,SACtB,qBAAqB,QAAQ,eAAe,oBAAoB,GAAG,EAAE,IACrE;AACN,QAAM,QACJ,QAAQ,iBAAiB,SACrB,qBAAqB,QAAQ,cAAc,mBAAmB,GAAG,EAAE,IACnE;AAEN,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,WAAW,OAA+C;AACjE,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,qBAAqB,OAAO,WAAW,GAAG,EAAE;AACrD;AAEA,SAAS,cAAc,UAAoC;AACzD,QAAM,UAAU,oBAAI,IAGlB;AACF,aAAW,UAAU,SAAS,SAAS;AACrC,UAAM,WAAW,QAAQ,IAAI,OAAO,KAAK;AACzC,QAAI,UAAU;AACZ,eAAS,QAAQ,KAAK,MAAM;AAAA,IAC9B,OAAO;AACL,cAAQ,IAAI,OAAO,OAAO;AAAA,QACxB,WAAW,OAAO;AAAA,QAClB,SAAS,CAAC,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,eAAe;AACnB,aAAW,CAAC,OAAO,KAAK,KAAK,SAAS;AACpC,QAAI,CAAC,cAAc;AACjB,cAAQ,IAAI;AAAA,IACd;AACA,mBAAe;AAEf,UAAM,iBAAiB,MAAM,QAAQ,CAAC,EAAG,aAAa;AACtD,YAAQ;AAAA,MACN,eAAM,KAAK,gBAAgB,OAAO,MAAM,WAAW,cAAc,CAAC;AAAA,IACpE;AAEA,eAAW,UAAU,MAAM,SAAS;AAClC,YAAM,WAAW,IAAI,cAAc;AAAA,QACjC,eAAe;AAAA,QACf,SAAS;AAAA,MACX,CAAC;AACD,YAAM,aAAa,IAAI,sBAAsB;AAE7C,iBAAW,SAAS,OAAO,eAAe;AACxC,0BAAkB,OAAO,OAAO,WAAW,UAAU,UAAU;AAAA,MACjE;AACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF;AACA,iBAAW,SAAS,OAAO,cAAc;AACvC,0BAAkB,OAAO,OAAO,WAAW,UAAU,UAAU;AAAA,MACjE;AACA,0BAAoB,UAAU,UAAU;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,eAAM;AAAA,QACJ,mBAAmB,SAAS,QAAQ,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,SACA,SACe;AACf,QAAM,gBAAgB,iBAAiB,SAAS,SAAS;AACzD,QAAM,EAAE,QAAQ,MAAM,IAAI,oBAAoB,OAAO;AAErD,MAAI,QAAQ,YAAY,UAAa,CAAC,OAAO,QAAQ,OAAO,GAAG;AAC7D,YAAQ;AAAA,MACN,eAAM,IAAI,4BAAuB,QAAQ,OAAO,0BAAqB;AAAA,IACvE;AACA,YAAQ,MAAM,eAAM,IAAI,4CAA4C,CAAC;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,QAAQ,UAAa,CAAC,OAAO,QAAQ,GAAG,GAAG;AACrD,YAAQ;AAAA,MACN,eAAM,IAAI,0BAAqB,QAAQ,GAAG,0BAAqB;AAAA,IACjE;AACA,YAAQ,MAAM,eAAM,IAAI,0CAA0C,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QACJ,QAAQ,UAAU,SACd,UAAU,QAAQ,KAAK,IACvB,KAAK,IAAI,IAAI;AACnB,QAAM,QAAQ,WAAW,QAAQ,KAAK;AAEtC,QAAM,WAAW,MAAM,eAAe;AAAA,IACpC,SAAS;AAAA,IACT,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,SAAS,QAAQ,WAAW,GAAG;AACjC,YAAQ,IAAI,eAAM,IAAI,kBAAkB,CAAC;AACzC,YAAQ;AAAA,MACN,eAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,gBAAc,QAAQ;AACxB;AAEO,IAAM,gBAAgB,IAAI,QAAQ,EACtC,KAAK,QAAQ,EACb,YAAY,iCAAiC,EAC7C,SAAS,aAAa,gBAAgB,EACtC,OAAO,2BAA2B,gCAAgC,EAClE,OAAO,4BAA4B,iCAAiC,EACpE,OAAO,qBAAqB,2CAA2C,EACvE,OAAO,gBAAgB,yBAAyB,EAChD,OAAO,cAAc,2BAA2B,EAChD,OAAO,kBAAkB,iCAAiC,EAC1D,OAAO,eAAe,yCAAyC,EAC/D;AAAA,EACC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAKF,EACC;AAAA,EACC;AAAA,IACE,OAAO,SAAiB,YAAsC;AAC5D,YAAM,EAAE,OAAO,GAAG,cAAc,IAAI;AACpC,YAAM,cAAc,SAAS,EAAE,GAAG,eAAe,SAAS,MAAM,CAAC;AAAA,IACnE;AAAA,EACF;AACF;","names":[]}
|
|
@@ -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-PHLVIRTN.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-JJNOLW3F.js.map
|