@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.
Files changed (109) hide show
  1. package/{agent-4SQZDYYN.js → agent-7NASKRN2.js} +4 -4
  2. package/{automation-WPG4IYVE.js → automation-DL2TSVCY.js} +21 -11
  3. package/automation-DL2TSVCY.js.map +1 -0
  4. package/{banking-S7GOP6WI.js → banking-7766P2VA.js} +2 -2
  5. package/{chat-6E34QZHI.js → chat-7Y3GRRQU.js} +2 -2
  6. package/{chunk-NUCGXUQW.js → chunk-2WLLGU5G.js} +2 -2
  7. package/{chunk-UQBJX5J5.js → chunk-BDVHHGRQ.js} +7 -7
  8. package/{chunk-O5WIIYWN.js → chunk-CYWNKBCJ.js} +2 -2
  9. package/{chunk-B33JIZI2.js → chunk-EIORAGIM.js} +3 -3
  10. package/chunk-H63W4KQL.js +160 -0
  11. package/chunk-H63W4KQL.js.map +1 -0
  12. package/{chunk-7DWLR3AY.js → chunk-IP5MKNYO.js} +9 -7
  13. package/{chunk-7DWLR3AY.js.map → chunk-IP5MKNYO.js.map} +1 -1
  14. package/{chunk-RYGMBENC.js → chunk-JJNOLW3F.js} +2 -2
  15. package/{chunk-Q47FRJVT.js → chunk-MES7TURQ.js} +51 -182
  16. package/chunk-MES7TURQ.js.map +1 -0
  17. package/{chunk-C3NCF7AC.js → chunk-PHLVIRTN.js} +56 -29
  18. package/chunk-PHLVIRTN.js.map +1 -0
  19. package/{chunk-PTXI3X6L.js → chunk-QCBHUHCP.js} +2 -2
  20. package/clerk.generated-ERU55NQP.js +402 -0
  21. package/clerk.generated-ERU55NQP.js.map +1 -0
  22. package/{computer-use-P5NZISFJ.js → computer-use-DFWKRS5C.js} +2 -2
  23. package/{connector-BF7GN5KJ.js → connector-XXMPNPPI.js} +3 -3
  24. package/{credit-MUMH2AFQ.js → credit-EXQA2ZKH.js} +2 -2
  25. package/{developer-support-YRODRFDP.js → developer-support-HV2KNBFK.js} +2 -2
  26. package/{doctor-SYQVWI4X.js → doctor-B3XKCTAQ.js} +5 -5
  27. package/dropbox.generated-ZZKEVL5X.js +140 -0
  28. package/dropbox.generated-ZZKEVL5X.js.map +1 -0
  29. package/{generate-SOTMY5L2.js → generate-76KZOWWD.js} +3 -3
  30. package/{github-M5QMAGUR.js → github-R33X2DZP.js} +2 -2
  31. package/{goal-UCWUNBDX.js → goal-6EHEH3W6.js} +2 -2
  32. package/{host-FBIUSQM5.js → host-QJVQWPTD.js} +2 -2
  33. package/index.js +20 -18
  34. package/index.js.map +1 -1
  35. package/{logs-2WS7C3NG.js → logs-TP25S725.js} +13 -11
  36. package/{logs-2WS7C3NG.js.map → logs-TP25S725.js.map} +1 -1
  37. package/{maps-F6HS3TX3.js → maps-GGAFUIRJ.js} +2 -2
  38. package/{model-WVSFDOUB.js → model-B3IPEBEY.js} +3 -3
  39. package/{model-provider-RW5KSE2A.js → model-provider-3AKAPHTA.js} +3 -3
  40. package/{org-HG7QC6H2.js → org-LCUQ4U3K.js} +2 -2
  41. package/package.json +1 -1
  42. package/{phone-Y53A3YR6.js → phone-3PZOGXP5.js} +2 -2
  43. package/{preference-PDDNKSID.js → preference-7BNRZYGT.js} +2 -2
  44. package/{resource-4RXH7SID.js → resource-FYGZW3VK.js} +2 -2
  45. package/{schedule-XUGLVIVF.js → schedule-MTI5OP23.js} +2 -2
  46. package/schedule-MTI5OP23.js.map +1 -0
  47. package/{search-NRX5C4BZ.js → search-G5335REW.js} +10 -8
  48. package/{search-NRX5C4BZ.js.map → search-G5335REW.js.map} +1 -1
  49. package/{secret-G6ZROM3S.js → secret-DPVN2UF2.js} +3 -3
  50. package/sentry.generated-Y3V3MFG5.js +112 -0
  51. package/sentry.generated-Y3V3MFG5.js.map +1 -0
  52. package/{slack-UE7PHE5Q.js → slack-T7G7IOD7.js} +2 -2
  53. package/strava.generated-FDURULCZ.js +76 -0
  54. package/strava.generated-FDURULCZ.js.map +1 -0
  55. package/{telegram-FMO5JNQL.js → telegram-AIUOTF4A.js} +2 -2
  56. package/{variable-3QU5KSPD.js → variable-UNXSGRUU.js} +2 -2
  57. package/{web-NUS7HONQ.js → web-NX3LRDTP.js} +2 -2
  58. package/{whoami-BVBVPCEX.js → whoami-W6ZRUGTN.js} +4 -4
  59. package/{workflow-KFXYP54E.js → workflow-F2YOTCAJ.js} +135 -95
  60. package/workflow-F2YOTCAJ.js.map +1 -0
  61. package/xero.generated-NPSQE6GC.js +164 -0
  62. package/xero.generated-NPSQE6GC.js.map +1 -0
  63. package/zero.js +32 -32
  64. package/automation-WPG4IYVE.js.map +0 -1
  65. package/chunk-C3NCF7AC.js.map +0 -1
  66. package/chunk-Q47FRJVT.js.map +0 -1
  67. package/clerk.generated-CUIJPEBA.js +0 -335
  68. package/clerk.generated-CUIJPEBA.js.map +0 -1
  69. package/dropbox.generated-SM45XNZI.js +0 -111
  70. package/dropbox.generated-SM45XNZI.js.map +0 -1
  71. package/schedule-XUGLVIVF.js.map +0 -1
  72. package/sentry.generated-TQZTJGQ4.js +0 -90
  73. package/sentry.generated-TQZTJGQ4.js.map +0 -1
  74. package/strava.generated-FK4SMYR7.js +0 -63
  75. package/strava.generated-FK4SMYR7.js.map +0 -1
  76. package/workflow-KFXYP54E.js.map +0 -1
  77. package/xero.generated-UVAXXS6Q.js +0 -129
  78. package/xero.generated-UVAXXS6Q.js.map +0 -1
  79. /package/{agent-4SQZDYYN.js.map → agent-7NASKRN2.js.map} +0 -0
  80. /package/{banking-S7GOP6WI.js.map → banking-7766P2VA.js.map} +0 -0
  81. /package/{chat-6E34QZHI.js.map → chat-7Y3GRRQU.js.map} +0 -0
  82. /package/{chunk-NUCGXUQW.js.map → chunk-2WLLGU5G.js.map} +0 -0
  83. /package/{chunk-UQBJX5J5.js.map → chunk-BDVHHGRQ.js.map} +0 -0
  84. /package/{chunk-O5WIIYWN.js.map → chunk-CYWNKBCJ.js.map} +0 -0
  85. /package/{chunk-B33JIZI2.js.map → chunk-EIORAGIM.js.map} +0 -0
  86. /package/{chunk-RYGMBENC.js.map → chunk-JJNOLW3F.js.map} +0 -0
  87. /package/{chunk-PTXI3X6L.js.map → chunk-QCBHUHCP.js.map} +0 -0
  88. /package/{computer-use-P5NZISFJ.js.map → computer-use-DFWKRS5C.js.map} +0 -0
  89. /package/{connector-BF7GN5KJ.js.map → connector-XXMPNPPI.js.map} +0 -0
  90. /package/{credit-MUMH2AFQ.js.map → credit-EXQA2ZKH.js.map} +0 -0
  91. /package/{developer-support-YRODRFDP.js.map → developer-support-HV2KNBFK.js.map} +0 -0
  92. /package/{doctor-SYQVWI4X.js.map → doctor-B3XKCTAQ.js.map} +0 -0
  93. /package/{generate-SOTMY5L2.js.map → generate-76KZOWWD.js.map} +0 -0
  94. /package/{github-M5QMAGUR.js.map → github-R33X2DZP.js.map} +0 -0
  95. /package/{goal-UCWUNBDX.js.map → goal-6EHEH3W6.js.map} +0 -0
  96. /package/{host-FBIUSQM5.js.map → host-QJVQWPTD.js.map} +0 -0
  97. /package/{maps-F6HS3TX3.js.map → maps-GGAFUIRJ.js.map} +0 -0
  98. /package/{model-WVSFDOUB.js.map → model-B3IPEBEY.js.map} +0 -0
  99. /package/{model-provider-RW5KSE2A.js.map → model-provider-3AKAPHTA.js.map} +0 -0
  100. /package/{org-HG7QC6H2.js.map → org-LCUQ4U3K.js.map} +0 -0
  101. /package/{phone-Y53A3YR6.js.map → phone-3PZOGXP5.js.map} +0 -0
  102. /package/{preference-PDDNKSID.js.map → preference-7BNRZYGT.js.map} +0 -0
  103. /package/{resource-4RXH7SID.js.map → resource-FYGZW3VK.js.map} +0 -0
  104. /package/{secret-G6ZROM3S.js.map → secret-DPVN2UF2.js.map} +0 -0
  105. /package/{slack-UE7PHE5Q.js.map → slack-T7G7IOD7.js.map} +0 -0
  106. /package/{telegram-FMO5JNQL.js.map → telegram-AIUOTF4A.js.map} +0 -0
  107. /package/{variable-3QU5KSPD.js.map → variable-UNXSGRUU.js.map} +0 -0
  108. /package/{web-NUS7HONQ.js.map → web-NX3LRDTP.js.map} +0 -0
  109. /package/{whoami-BVBVPCEX.js.map → whoami-W6ZRUGTN.js.map} +0 -0
@@ -3,26 +3,28 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  searchCommand
6
- } from "./chunk-7DWLR3AY.js";
6
+ } from "./chunk-IP5MKNYO.js";
7
7
  import {
8
- EventRenderer,
9
- EventStreamNormalizer,
10
8
  collectLogItems,
11
- formatIsoTimestamp,
12
- isSupportedFramework,
13
- isUUID,
14
9
  parseBoundedLogCount,
15
10
  parsePositiveLogCount,
16
11
  parseTime
17
- } from "./chunk-Q47FRJVT.js";
12
+ } from "./chunk-H63W4KQL.js";
13
+ import {
14
+ EventRenderer,
15
+ EventStreamNormalizer,
16
+ formatIsoTimestamp,
17
+ isSupportedFramework,
18
+ isUUID
19
+ } from "./chunk-MES7TURQ.js";
18
20
  import "./chunk-7HZXC5CL.js";
19
- import "./chunk-PTXI3X6L.js";
20
- import "./chunk-O5WIIYWN.js";
21
+ import "./chunk-QCBHUHCP.js";
22
+ import "./chunk-CYWNKBCJ.js";
21
23
  import "./chunk-LTDQISD7.js";
22
24
  import {
23
25
  getZeroRunAgentEvents,
24
26
  listZeroLogs
25
- } from "./chunk-C3NCF7AC.js";
27
+ } from "./chunk-PHLVIRTN.js";
26
28
  import {
27
29
  withErrorHandler
28
30
  } from "./chunk-3F4RFLPX.js";
@@ -274,4 +276,4 @@ Examples:
274
276
  export {
275
277
  zeroLogsCommand
276
278
  };
277
- //# sourceMappingURL=logs-2WS7C3NG.js.map
279
+ //# sourceMappingURL=logs-TP25S725.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { EventStreamNormalizer } from \"../../../lib/events/event-stream-normalizer\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport {\n collectLogItems,\n parsePositiveLogCount,\n} from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { isSupportedFramework } from \"@vm0/core/frameworks\";\n\nconst PAGE_LIMIT = 100;\n\ninterface AgentEventWithFramework {\n readonly event: RunEvent;\n readonly framework?: string;\n readonly useDefaultFramework: boolean;\n}\n\nfunction supportedLogFramework(\n framework: string | undefined,\n): string | undefined {\n return isSupportedFramework(framework) ? framework : undefined;\n}\n\nfunction hasLogFramework(framework: string | null | undefined): boolean {\n return framework !== undefined && framework !== null;\n}\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n framework: string | undefined,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n framework,\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const events = await collectLogItems<AgentEventWithFramework>({\n fetchPage: async (request) => {\n const response = await getZeroRunAgentEvents(runId, request);\n const responseFramework: string | null | undefined = response.framework;\n return {\n items: response.events.map((event) => {\n const framework = supportedLogFramework(\n responseFramework ?? undefined,\n );\n return {\n event,\n ...(framework ? { framework } : {}),\n useDefaultFramework: !hasLogFramework(responseFramework),\n };\n }),\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = events.find((item) => {\n return item.framework !== undefined;\n })?.framework;\n const normalizer = new EventStreamNormalizer();\n\n for (const item of events) {\n renderAgentEvent(\n item.event,\n renderer,\n normalizer,\n item.framework ?? (item.useDefaultFramework ? framework : undefined),\n );\n }\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n renderer.flush();\n}\n\nexport const zeroLogsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to view agent events for\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs <runId>\n zero logs <runId> --tail 10\n zero logs <runId> --all\n zero logs search \"error\"`,\n )\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n zeroLogsCommand.help();\n return;\n }\n\n if (!isUUID(runId)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${runId}\" — 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 countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n let since: number | undefined;\n if (options.since !== undefined) {\n since = parseTime(options.since);\n }\n\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = parsePositiveLogCount(options.head!, \"--head\");\n } else if (isTail) {\n targetCount = parsePositiveLogCount(options.tail!, \"--tail\");\n } else {\n targetCount = 5;\n }\n\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n await showAgentEvents(runId, { since, targetCount, order });\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroLogs } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"failed\":\n case \"timeout\":\n return chalk.red(status);\n case \"running\":\n case \"pending\":\n case \"queued\":\n return chalk.yellow(status);\n case \"cancelled\":\n return chalk.dim(status);\n default:\n return status;\n }\n}\n\nfunction formatTime(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\n \"--status <status>\",\n \"Filter by status (queued|pending|running|completed|failed|timeout|cancelled)\",\n )\n .option(\n \"--since <time>\",\n \"Filter runs created since (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--limit <n>\", \"Maximum number of results (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs list --agent 123e4567-e89b-12d3-a456-426614174000\n zero logs list --status completed --limit 10\n zero logs list --since 1h\n zero logs list --since 1d --status completed`,\n )\n .action(\n withErrorHandler(\n async (options: {\n agent?: string;\n status?: string;\n since?: string;\n limit?: string;\n }) => {\n const limit =\n options.limit !== undefined\n ? parseBoundedLogCount(options.limit, \"--limit\", 1, 100)\n : undefined;\n const since =\n options.since !== undefined ? parseTime(options.since) : undefined;\n if (options.agent !== undefined && !isUUID(options.agent)) {\n console.error(\n chalk.red(\n `✗ Invalid agent ID \"${options.agent}\" — expected a UUID`,\n ),\n );\n console.error(\n chalk.dim(\" Run: zero logs list to find agent IDs\"),\n );\n process.exit(1);\n }\n\n const result = await listZeroLogs({\n agentId: options.agent,\n status: options.status,\n since,\n limit,\n });\n\n if (result.data.length === 0) {\n console.log(chalk.dim(\"No logs found\"));\n return;\n }\n\n const nameCol = Math.max(\n 5,\n ...result.data.map((r) => {\n return (r.displayName || r.agentId || \"-\").length;\n }),\n );\n const statusCol = Math.max(\n 6,\n ...result.data.map((r) => {\n return r.status.length;\n }),\n );\n\n const header = [\n \"RUN ID\".padEnd(38),\n \"AGENT\".padEnd(nameCol),\n \"STATUS\".padEnd(statusCol),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const entry of result.data) {\n const runId = entry.id;\n const name = entry.displayName || entry.agentId || \"-\";\n const row = [\n runId.padEnd(38),\n name.padEnd(nameCol),\n formatStatus(entry.status).padEnd(statusCol),\n formatTime(entry.createdAt),\n ].join(\" \");\n console.log(row);\n }\n\n if (result.pagination.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${result.data.length} of more results. Use --limit to adjust.`,\n ),\n );\n }\n },\n ),\n );\n"],"mappings":"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","names":["framework"]}
1
+ {"version":3,"sources":["../src/commands/zero/logs/index.ts","../src/commands/zero/logs/list.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getZeroRunAgentEvents, type RunEvent } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { EventStreamNormalizer } from \"../../../lib/events/event-stream-normalizer\";\nimport { EventRenderer } from \"../../../lib/events/event-renderer\";\nimport {\n collectLogItems,\n parsePositiveLogCount,\n} from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\nimport { listCommand } from \"./list\";\nimport { searchCommand } from \"./search\";\nimport { isSupportedFramework } from \"@vm0/core/frameworks\";\n\nconst PAGE_LIMIT = 100;\n\ninterface AgentEventWithFramework {\n readonly event: RunEvent;\n readonly framework?: string;\n readonly useDefaultFramework: boolean;\n}\n\nfunction supportedLogFramework(\n framework: string | undefined,\n): string | undefined {\n return isSupportedFramework(framework) ? framework : undefined;\n}\n\nfunction hasLogFramework(framework: string | null | undefined): boolean {\n return framework !== undefined && framework !== null;\n}\n\nfunction renderAgentEvent(\n event: RunEvent,\n renderer: EventRenderer,\n normalizer: EventStreamNormalizer,\n framework: string | undefined,\n): void {\n const parsedEvents = normalizer.process(\n event.eventData,\n framework,\n new Date(event.createdAt),\n );\n for (const parsed of parsedEvents) {\n renderer.render(parsed);\n }\n}\n\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n const events = await collectLogItems<AgentEventWithFramework>({\n fetchPage: async (request) => {\n const response = await getZeroRunAgentEvents(runId, request);\n const responseFramework: string | null | undefined = response.framework;\n return {\n items: response.events.map((event) => {\n const framework = supportedLogFramework(\n responseFramework ?? undefined,\n );\n return {\n event,\n ...(framework ? { framework } : {}),\n useDefaultFramework: !hasLogFramework(responseFramework),\n };\n }),\n hasMore: response.hasMore,\n nextCursor: response.nextCursor,\n };\n },\n sinceTime: options.since,\n targetCount: options.targetCount,\n order: options.order,\n pageLimit: PAGE_LIMIT,\n });\n\n if (events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: true,\n });\n const framework = events.find((item) => {\n return item.framework !== undefined;\n })?.framework;\n const normalizer = new EventStreamNormalizer();\n\n for (const item of events) {\n renderAgentEvent(\n item.event,\n renderer,\n normalizer,\n item.framework ?? (item.useDefaultFramework ? framework : undefined),\n );\n }\n for (const parsed of normalizer.flush()) {\n renderer.render(parsed);\n }\n renderer.flush();\n}\n\nexport const zeroLogsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to view agent events for\")\n .addCommand(listCommand)\n .addCommand(searchCommand)\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs <runId>\n zero logs <runId> --tail 10\n zero logs <runId> --all\n zero logs search \"error\"`,\n )\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n zeroLogsCommand.help();\n return;\n }\n\n if (!isUUID(runId)) {\n console.error(\n chalk.red(`✗ Invalid run ID \"${runId}\" — 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 countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n let since: number | undefined;\n if (options.since !== undefined) {\n since = parseTime(options.since);\n }\n\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = parsePositiveLogCount(options.head!, \"--head\");\n } else if (isTail) {\n targetCount = parsePositiveLogCount(options.tail!, \"--tail\");\n } else {\n targetCount = 5;\n }\n\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n await showAgentEvents(runId, { since, targetCount, order });\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroLogs } from \"../../../lib/api\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { isUUID } from \"../../run/shared\";\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"completed\":\n return chalk.green(status);\n case \"failed\":\n case \"timeout\":\n return chalk.red(status);\n case \"running\":\n case \"pending\":\n case \"queued\":\n return chalk.yellow(status);\n case \"cancelled\":\n return chalk.dim(status);\n default:\n return status;\n }\n}\n\nfunction formatTime(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List agent run logs\")\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\n \"--status <status>\",\n \"Filter by status (queued|pending|running|completed|failed|timeout|cancelled)\",\n )\n .option(\n \"--since <time>\",\n \"Filter runs created since (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--limit <n>\", \"Maximum number of results (default: 20)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n zero logs list\n zero logs list --agent 123e4567-e89b-12d3-a456-426614174000\n zero logs list --status completed --limit 10\n zero logs list --since 1h\n zero logs list --since 1d --status completed`,\n )\n .action(\n withErrorHandler(\n async (options: {\n agent?: string;\n status?: string;\n since?: string;\n limit?: string;\n }) => {\n const limit =\n options.limit !== undefined\n ? parseBoundedLogCount(options.limit, \"--limit\", 1, 100)\n : undefined;\n const since =\n options.since !== undefined ? parseTime(options.since) : undefined;\n if (options.agent !== undefined && !isUUID(options.agent)) {\n console.error(\n chalk.red(\n `✗ Invalid agent ID \"${options.agent}\" — expected a UUID`,\n ),\n );\n console.error(\n chalk.dim(\" Run: zero logs list to find agent IDs\"),\n );\n process.exit(1);\n }\n\n const result = await listZeroLogs({\n agentId: options.agent,\n status: options.status,\n since,\n limit,\n });\n\n if (result.data.length === 0) {\n console.log(chalk.dim(\"No logs found\"));\n return;\n }\n\n const nameCol = Math.max(\n 5,\n ...result.data.map((r) => {\n return (r.displayName || r.agentId || \"-\").length;\n }),\n );\n const statusCol = Math.max(\n 6,\n ...result.data.map((r) => {\n return r.status.length;\n }),\n );\n\n const header = [\n \"RUN ID\".padEnd(38),\n \"AGENT\".padEnd(nameCol),\n \"STATUS\".padEnd(statusCol),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n for (const entry of result.data) {\n const runId = entry.id;\n const name = entry.displayName || entry.agentId || \"-\";\n const row = [\n runId.padEnd(38),\n name.padEnd(nameCol),\n formatStatus(entry.status).padEnd(statusCol),\n formatTime(entry.createdAt),\n ].join(\" \");\n console.log(row);\n }\n\n if (result.pagination.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing ${result.data.length} of more results. Use --limit to adjust.`,\n ),\n );\n }\n },\n ),\n );\n"],"mappings":"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","names":["framework"]}
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import "./chunk-LTDQISD7.js";
5
5
  import {
6
6
  callZeroMaps
7
- } from "./chunk-C3NCF7AC.js";
7
+ } from "./chunk-PHLVIRTN.js";
8
8
  import {
9
9
  withErrorHandler
10
10
  } from "./chunk-3F4RFLPX.js";
@@ -484,4 +484,4 @@ Notes:
484
484
  export {
485
485
  zeroMapsCommand
486
486
  };
487
- //# sourceMappingURL=maps-F6HS3TX3.js.map
487
+ //# sourceMappingURL=maps-GGAFUIRJ.js.map
@@ -5,12 +5,12 @@ import {
5
5
  formatModelPolicyStatus,
6
6
  formatModelProviderRoute,
7
7
  getModelProviderRouteKind
8
- } from "./chunk-RYGMBENC.js";
8
+ } from "./chunk-JJNOLW3F.js";
9
9
  import "./chunk-LTDQISD7.js";
10
10
  import {
11
11
  getVm0ModelPriceTier,
12
12
  listZeroModelPolicies
13
- } from "./chunk-C3NCF7AC.js";
13
+ } from "./chunk-PHLVIRTN.js";
14
14
  import {
15
15
  withErrorHandler
16
16
  } from "./chunk-3F4RFLPX.js";
@@ -90,4 +90,4 @@ export {
90
90
  switchCommand,
91
91
  zeroModelCommand
92
92
  };
93
- //# sourceMappingURL=model-WVSFDOUB.js.map
93
+ //# sourceMappingURL=model-B3IPEBEY.js.map
@@ -5,11 +5,11 @@ import {
5
5
  formatModelPolicyStatus,
6
6
  getModelProviderRouteKind,
7
7
  getModelProviderTypeLabel
8
- } from "./chunk-RYGMBENC.js";
8
+ } from "./chunk-JJNOLW3F.js";
9
9
  import "./chunk-LTDQISD7.js";
10
10
  import {
11
11
  listZeroModelPolicies
12
- } from "./chunk-C3NCF7AC.js";
12
+ } from "./chunk-PHLVIRTN.js";
13
13
  import {
14
14
  withErrorHandler
15
15
  } from "./chunk-3F4RFLPX.js";
@@ -74,4 +74,4 @@ export {
74
74
  setCommand,
75
75
  zeroModelProviderCommand
76
76
  };
77
- //# sourceMappingURL=model-provider-RW5KSE2A.js.map
77
+ //# sourceMappingURL=model-provider-3AKAPHTA.js.map
@@ -33,7 +33,7 @@ import {
33
33
  switchZeroOrg,
34
34
  updateZeroOrg,
35
35
  upsertZeroOrgModelProvider
36
- } from "./chunk-C3NCF7AC.js";
36
+ } from "./chunk-PHLVIRTN.js";
37
37
  import {
38
38
  ApiRequestError,
39
39
  getActiveOrg,
@@ -919,4 +919,4 @@ var zeroOrgCommand = new Command().name("org").description("Manage organization
919
919
  export {
920
920
  zeroOrgCommand
921
921
  };
922
- //# sourceMappingURL=org-HG7QC6H2.js.map
922
+ //# sourceMappingURL=org-LCUQ4U3K.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.219.0",
3
+ "version": "9.220.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",
@@ -7,7 +7,7 @@ import {
7
7
  downloadPhoneFile,
8
8
  initPhoneFileUpload,
9
9
  sendPhoneMessage
10
- } from "./chunk-C3NCF7AC.js";
10
+ } from "./chunk-PHLVIRTN.js";
11
11
  import {
12
12
  withErrorHandler
13
13
  } from "./chunk-3F4RFLPX.js";
@@ -201,4 +201,4 @@ Examples:
201
201
  export {
202
202
  zeroPhoneCommand
203
203
  };
204
- //# sourceMappingURL=phone-Y53A3YR6.js.map
204
+ //# sourceMappingURL=phone-3PZOGXP5.js.map
@@ -9,7 +9,7 @@ import "./chunk-LTDQISD7.js";
9
9
  import {
10
10
  getZeroUserPreferences,
11
11
  updateZeroUserPreferences
12
- } from "./chunk-C3NCF7AC.js";
12
+ } from "./chunk-PHLVIRTN.js";
13
13
  import {
14
14
  withErrorHandler
15
15
  } from "./chunk-3F4RFLPX.js";
@@ -107,4 +107,4 @@ var zeroPreferenceCommand = new Command().name("preference").description("View o
107
107
  export {
108
108
  zeroPreferenceCommand
109
109
  };
110
- //# sourceMappingURL=preference-PDDNKSID.js.map
110
+ //# sourceMappingURL=preference-7BNRZYGT.js.map
@@ -16,7 +16,7 @@ import {
16
16
  import "./chunk-LTDQISD7.js";
17
17
  import {
18
18
  getRegistryResourceDownload
19
- } from "./chunk-C3NCF7AC.js";
19
+ } from "./chunk-PHLVIRTN.js";
20
20
  import {
21
21
  withErrorHandler
22
22
  } from "./chunk-3F4RFLPX.js";
@@ -138,4 +138,4 @@ export {
138
138
  findRegistryResourceForPull,
139
139
  zeroResourceCommand
140
140
  };
141
- //# sourceMappingURL=resource-4RXH7SID.js.map
141
+ //# sourceMappingURL=resource-FYGZW3VK.js.map
@@ -17,7 +17,7 @@ var RENAME_NOTICE = [
17
17
  "The schedule commands were renamed: schedules are Automations now.",
18
18
  "",
19
19
  `Manage them with ${source_default.cyan("zero automation")}, for example:`,
20
- ` ${source_default.cyan('zero automation create <name> --agent <agent> --cron "0 9 * * *" "<instruction>"')}`,
20
+ ` ${source_default.cyan('zero automation create -n alerts --agent <agent-id> -p "<instruction>" --cron "0 9 * * *"')}`,
21
21
  ` ${source_default.cyan("zero automation list")}`,
22
22
  ` ${source_default.cyan("zero automation --help")}`
23
23
  ].join("\n");
@@ -28,4 +28,4 @@ var zeroScheduleCommand = new Command("schedule").description("(removed: use `ze
28
28
  export {
29
29
  zeroScheduleCommand
30
30
  };
31
- //# sourceMappingURL=schedule-XUGLVIVF.js.map
31
+ //# sourceMappingURL=schedule-MTI5OP23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/zero/schedule.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\n\n// The schedule command tree was removed in #17307: schedules are Automations\n// now. This stub keeps `zero schedule ...` from failing with an opaque\n// unknown-command error and points at the replacement instead.\nconst RENAME_NOTICE = [\n \"The schedule commands were renamed: schedules are Automations now.\",\n \"\",\n `Manage them with ${chalk.cyan(\"zero automation\")}, for example:`,\n ` ${chalk.cyan('zero automation create -n alerts --agent <agent-id> -p \"<instruction>\" --cron \"0 9 * * *\"')}`,\n ` ${chalk.cyan(\"zero automation list\")}`,\n ` ${chalk.cyan(\"zero automation --help\")}`,\n].join(\"\\n\");\n\nexport const zeroScheduleCommand = new Command(\"schedule\")\n .description(\"(removed: use `zero automation`) Schedules are Automations now\")\n .helpOption(false)\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .argument(\"[args...]\")\n .action(() => {\n console.error(RENAME_NOTICE);\n process.exitCode = 1;\n });\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAMA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,oBAAoB,eAAM,KAAK,iBAAiB,CAAC;AAAA,EACjD,KAAK,eAAM,KAAK,2FAA2F,CAAC;AAAA,EAC5G,KAAK,eAAM,KAAK,sBAAsB,CAAC;AAAA,EACvC,KAAK,eAAM,KAAK,wBAAwB,CAAC;AAC3C,EAAE,KAAK,IAAI;AAEJ,IAAM,sBAAsB,IAAI,QAAQ,UAAU,EACtD,YAAY,gEAAgE,EAC5E,WAAW,KAAK,EAChB,mBAAmB,IAAI,EACvB,qBAAqB,IAAI,EACzB,SAAS,WAAW,EACpB,OAAO,MAAM;AACZ,UAAQ,MAAM,aAAa;AAC3B,UAAQ,WAAW;AACrB,CAAC;","names":[]}
@@ -3,21 +3,23 @@ import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  runLogsSearch
6
- } from "./chunk-7DWLR3AY.js";
6
+ } from "./chunk-IP5MKNYO.js";
7
7
  import {
8
- formatIsoTimestamp,
9
- isUUID,
10
8
  parseBoundedLogCount,
11
9
  parseSearchQuery,
12
10
  parseTime
13
- } from "./chunk-Q47FRJVT.js";
11
+ } from "./chunk-H63W4KQL.js";
12
+ import {
13
+ formatIsoTimestamp,
14
+ isUUID
15
+ } from "./chunk-MES7TURQ.js";
14
16
  import "./chunk-7HZXC5CL.js";
15
- import "./chunk-PTXI3X6L.js";
16
- import "./chunk-O5WIIYWN.js";
17
+ import "./chunk-QCBHUHCP.js";
18
+ import "./chunk-CYWNKBCJ.js";
17
19
  import "./chunk-LTDQISD7.js";
18
20
  import {
19
21
  searchZeroChat
20
- } from "./chunk-C3NCF7AC.js";
22
+ } from "./chunk-PHLVIRTN.js";
21
23
  import {
22
24
  withErrorHandler
23
25
  } from "./chunk-3F4RFLPX.js";
@@ -201,4 +203,4 @@ export {
201
203
  buildSlackRecipe,
202
204
  zeroSearchCommand
203
205
  };
204
- //# sourceMappingURL=search-NRX5C4BZ.js.map
206
+ //# sourceMappingURL=search-G5335REW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/zero/search/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\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\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agentId: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\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\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run !== undefined) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n if (options.agent !== undefined && !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 logs list to find agent IDs\"));\n process.exit(1);\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agentId: options.agent,\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 renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const searchQuery = parseSearchQuery(query, \"Query\");\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(searchQuery, options);\n return;\n case \"chat\":\n await runChatSource(searchQuery, options);\n return;\n case \"slack\":\n await runSlackSource(searchQuery, options);\n return;\n }\n }),\n );\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/commands/zero/search/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { runLogsSearch, type LogsSearchCliOptions } from \"../logs/search\";\nimport { searchZeroChat } from \"../../../lib/api\";\nimport type {\n ChatSearchMessage,\n ChatSearchResponse,\n} from \"@vm0/api-contracts/contracts/chat-threads\";\nimport { parseTime } from \"../../../lib/utils/time-parser\";\nimport { formatIsoTimestamp } from \"../../../lib/utils/time-format\";\nimport { parseBoundedLogCount } from \"../../../lib/utils/log-pagination\";\nimport { parseSearchQuery } from \"../../../lib/utils/search-query\";\nimport { isUUID } from \"../../run/shared\";\n\nconst SUPPORTED_SOURCES = [\"logs\", \"chat\", \"slack\"] as const;\ntype Source = (typeof SUPPORTED_SOURCES)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport const SEARCH_EXPLAINER = `\nAvailable sources:\n logs full agent event stream (tool calls, tokens, system events) from agent runs\n chat user/assistant text messages as shown in the web chat UI\n slack returns a recipe for calling the Slack API directly; requires the Slack connector\n\nUsage: zero search <query> --source <logs|chat|slack> [flags]\nRun 'zero search --help' for all flags.`;\n\nexport function buildSlackRecipe(query: string): string {\n const encoded = encodeURIComponent(query);\n return `The \\`slack\\` source does not call Slack from this CLI. Run the\nfollowing inside an agent sandbox that has $SLACK_TOKEN available:\n\n curl -H \"Authorization: Bearer $SLACK_TOKEN\" \\\\\n \"https://slack.com/api/search.messages?query=${encoded}\"\n\nIf you don't have $SLACK_TOKEN, check the connector status:\n zero connector status slack\n\nTo verify the token and network policy end-to-end:\n zero doctor check-connector --env-name SLACK_TOKEN\n\nSlack API docs: https://api.slack.com/methods/search.messages\n\nNote: CLI-local flags (--limit, --since, -A/-B/-C) are ignored for the\nslack source. Pass equivalents to Slack's API via count= / highlight=\nquery parameters instead.`;\n}\n\ninterface SearchOptions {\n source: string[];\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n}\n\nfunction collectSource(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction parseContextOptions(options: SearchOptions): {\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\nasync function runLogsSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n const logsOptions: LogsSearchCliOptions = {\n afterContext: options.afterContext,\n beforeContext: options.beforeContext,\n context: options.context,\n agentId: options.agent,\n run: options.run,\n since: options.since,\n limit: options.limit,\n };\n await runLogsSearch(query, logsOptions);\n}\n\nfunction formatTimestamp(iso: string): string {\n return formatIsoTimestamp(iso);\n}\n\nfunction renderChatMessage(msg: ChatSearchMessage, isMatch: boolean): void {\n const marker = isMatch ? chalk.yellow(\"▸\") : chalk.dim(\"·\");\n const header = `${marker} ${chalk.dim(msg.role)} ${chalk.dim(formatTimestamp(msg.createdAt))}`;\n console.log(header);\n console.log(isMatch ? msg.content : chalk.dim(msg.content));\n}\n\nfunction renderChatResults(response: ChatSearchResponse): void {\n let isFirst = true;\n for (const result of response.results) {\n if (!isFirst) console.log();\n isFirst = false;\n\n console.log(\n chalk.bold(\n `── Thread ${result.chatThreadId} (${result.agentName}) ──────────`,\n ),\n );\n for (const msg of result.contextBefore) {\n renderChatMessage(msg, false);\n }\n renderChatMessage(result.matchedMessage, true);\n for (const msg of result.contextAfter) {\n renderChatMessage(msg, false);\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\nasync function runChatSource(\n query: string,\n options: SearchOptions,\n): Promise<void> {\n if (options.run !== undefined) {\n throw new Error(\"--run is not supported with --source chat\");\n }\n if (options.agent !== undefined && !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 logs list to find agent IDs\"));\n process.exit(1);\n }\n\n const { before, after } = parseContextOptions(options);\n const limit = parseLimit(options.limit);\n const since =\n options.since !== undefined\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n\n const response = await searchZeroChat({\n keyword: query,\n agentId: options.agent,\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 renderChatResults(response);\n}\n\nasync function runSlackSource(\n query: string,\n _options: SearchOptions,\n): Promise<void> {\n console.log(buildSlackRecipe(query));\n}\n\nexport const zeroSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search logs, chat, or get a recipe for external sources\")\n .argument(\"<query>\", \"Search query\")\n .option(\n \"--source <type>\",\n \"Source to search: logs | chat | slack (pass once)\",\n collectSource,\n [] as string[],\n )\n .option(\"--agent <id>\", \"Filter by Zero agent ID\")\n .option(\"--run <id>\", \"Filter by run ID\")\n .option(\"--since <time>\", \"Time window (e.g., 7d, 2h)\")\n .option(\"--limit <n>\", \"Maximum number of matches\")\n .option(\"-A, --after-context <n>\", \"Show n items after each match\")\n .option(\"-B, --before-context <n>\", \"Show n items before each match\")\n .option(\"-C, --context <n>\", \"Show n items before and after each match\")\n .addHelpText(\"after\", SEARCH_EXPLAINER)\n .action(\n withErrorHandler(async (query: string, options: SearchOptions) => {\n const searchQuery = parseSearchQuery(query, \"Query\");\n const sources = options.source;\n\n if (sources.length === 0) {\n console.log(SEARCH_EXPLAINER);\n return;\n }\n\n if (sources.length > 1) {\n throw new Error(\"Only one --source is allowed.\");\n }\n\n const source = sources[0]!;\n if (!SUPPORTED_SOURCES.includes(source as Source)) {\n throw new Error(\n `Unknown --source \"${source}\". Expected one of: ${SUPPORTED_SOURCES.join(\", \")}`,\n );\n }\n\n switch (source as Source) {\n case \"logs\":\n await runLogsSource(searchQuery, options);\n return;\n case \"chat\":\n await runChatSource(searchQuery, options);\n return;\n case \"slack\":\n await runSlackSource(searchQuery, options);\n return;\n }\n }),\n );\n"],"mappings":"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","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
  getConnectorStoredSecretDisplayInfo
6
- } from "./chunk-O5WIIYWN.js";
6
+ } from "./chunk-CYWNKBCJ.js";
7
7
  import {
8
8
  isInteractive,
9
9
  promptConfirm,
@@ -14,7 +14,7 @@ import {
14
14
  deleteZeroSecret,
15
15
  listZeroSecrets,
16
16
  setZeroSecret
17
- } from "./chunk-C3NCF7AC.js";
17
+ } from "./chunk-PHLVIRTN.js";
18
18
  import {
19
19
  withErrorHandler
20
20
  } from "./chunk-3F4RFLPX.js";
@@ -160,4 +160,4 @@ var zeroSecretCommand = new Command().name("secret").description("Read or write
160
160
  export {
161
161
  zeroSecretCommand
162
162
  };
163
- //# sourceMappingURL=secret-G6ZROM3S.js.map
163
+ //# sourceMappingURL=secret-DPVN2UF2.js.map
@@ -0,0 +1,112 @@
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
+ // ../../packages/connectors/src/firewall-metadata/permission-details/sentry.generated.ts
9
+ init_esm_shims();
10
+ var firewallPermissionMetadata = {
11
+ "type": "sentry",
12
+ "label": "Sentry",
13
+ "permissionCount": 22,
14
+ "permissions": [
15
+ {
16
+ "name": "alerts:read",
17
+ "description": "Read alert rules, detectors, monitors, workflows, and check-in status."
18
+ },
19
+ {
20
+ "name": "alerts:write",
21
+ "description": "Create, update, or delete alert rules, detectors, monitors, and workflows."
22
+ },
23
+ {
24
+ "name": "event:admin",
25
+ "description": "Administer Sentry issues, including deleting issues and external issue links."
26
+ },
27
+ {
28
+ "name": "event:read",
29
+ "description": "Read Sentry issues, events, tags, hashes, short IDs, and replay viewer data."
30
+ },
31
+ {
32
+ "name": "event:write",
33
+ "description": "Update Sentry issues, run issue autofix actions, and create external issue links."
34
+ },
35
+ {
36
+ "name": "member:admin",
37
+ "description": "Administer organization members and SCIM users, including removals."
38
+ },
39
+ {
40
+ "name": "member:invite",
41
+ "description": "Invite organization members and update pending member invitations."
42
+ },
43
+ {
44
+ "name": "member:read",
45
+ "description": "Read organization member and SCIM user records."
46
+ },
47
+ {
48
+ "name": "member:write",
49
+ "description": "Create and update organization members and SCIM users."
50
+ },
51
+ {
52
+ "name": "org:admin",
53
+ "description": "Delete and administer organization-level resources such as dashboards, saved queries, notifications, external users, and Sentry apps."
54
+ },
55
+ {
56
+ "name": "org:ci",
57
+ "description": "Use CI and deployment workflows, including releases, deploys, and build artifacts."
58
+ },
59
+ {
60
+ "name": "org:integrations",
61
+ "description": "Read and manage organization integrations and Sentry app installations."
62
+ },
63
+ {
64
+ "name": "org:read",
65
+ "description": "Read organization metadata, dashboards, discoveries, projects, teams, replays, events, stats, and related resources."
66
+ },
67
+ {
68
+ "name": "org:write",
69
+ "description": "Create and update organization-level resources such as dashboards, saved queries, forwarding, teams, workflows, and Sentry apps."
70
+ },
71
+ {
72
+ "name": "project:admin",
73
+ "description": "Delete and administer project-level resources such as projects, keys, hooks, filters, monitors, releases, rules, and symbol sources."
74
+ },
75
+ {
76
+ "name": "project:distribution",
77
+ "description": "Read project build distribution artifacts."
78
+ },
79
+ {
80
+ "name": "project:read",
81
+ "description": "Read project settings, events, environments, releases, monitors, replays, rules, keys, teams, and user feedback."
82
+ },
83
+ {
84
+ "name": "project:releases",
85
+ "description": "Read and manage Sentry releases, deploys, release files, commits, and debug symbol files."
86
+ },
87
+ {
88
+ "name": "project:write",
89
+ "description": "Create and update project settings, events, environments, debug files, hooks, keys, monitors, ownership, rules, symbol sources, teams, and user feedback."
90
+ },
91
+ {
92
+ "name": "team:admin",
93
+ "description": "Administer teams, SCIM groups, external teams, and team memberships."
94
+ },
95
+ {
96
+ "name": "team:read",
97
+ "description": "Read teams, SCIM groups, and team memberships."
98
+ },
99
+ {
100
+ "name": "team:write",
101
+ "description": "Create and update teams, SCIM groups, external teams, and team memberships."
102
+ }
103
+ ],
104
+ "defaultPolicy": {
105
+ "permissionDefault": "allow",
106
+ "unknownPolicy": "allow"
107
+ }
108
+ };
109
+ export {
110
+ firewallPermissionMetadata
111
+ };
112
+ //# sourceMappingURL=sentry.generated-Y3V3MFG5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/connectors/src/firewall-metadata/permission-details/sentry.generated.ts"],"sourcesContent":["// Auto-generated by @vm0/firewalls-generator.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate\n//\n// DO NOT EDIT THIS FILE MANUALLY.\nimport type { FirewallPermissionDetailMetadata } from \"../types\";\n\nexport const firewallPermissionMetadata = {\n \"type\": \"sentry\",\n \"label\": \"Sentry\",\n \"permissionCount\": 22,\n \"permissions\": [\n {\n \"name\": \"alerts:read\",\n \"description\": \"Read alert rules, detectors, monitors, workflows, and check-in status.\"\n },\n {\n \"name\": \"alerts:write\",\n \"description\": \"Create, update, or delete alert rules, detectors, monitors, and workflows.\"\n },\n {\n \"name\": \"event:admin\",\n \"description\": \"Administer Sentry issues, including deleting issues and external issue links.\"\n },\n {\n \"name\": \"event:read\",\n \"description\": \"Read Sentry issues, events, tags, hashes, short IDs, and replay viewer data.\"\n },\n {\n \"name\": \"event:write\",\n \"description\": \"Update Sentry issues, run issue autofix actions, and create external issue links.\"\n },\n {\n \"name\": \"member:admin\",\n \"description\": \"Administer organization members and SCIM users, including removals.\"\n },\n {\n \"name\": \"member:invite\",\n \"description\": \"Invite organization members and update pending member invitations.\"\n },\n {\n \"name\": \"member:read\",\n \"description\": \"Read organization member and SCIM user records.\"\n },\n {\n \"name\": \"member:write\",\n \"description\": \"Create and update organization members and SCIM users.\"\n },\n {\n \"name\": \"org:admin\",\n \"description\": \"Delete and administer organization-level resources such as dashboards, saved queries, notifications, external users, and Sentry apps.\"\n },\n {\n \"name\": \"org:ci\",\n \"description\": \"Use CI and deployment workflows, including releases, deploys, and build artifacts.\"\n },\n {\n \"name\": \"org:integrations\",\n \"description\": \"Read and manage organization integrations and Sentry app installations.\"\n },\n {\n \"name\": \"org:read\",\n \"description\": \"Read organization metadata, dashboards, discoveries, projects, teams, replays, events, stats, and related resources.\"\n },\n {\n \"name\": \"org:write\",\n \"description\": \"Create and update organization-level resources such as dashboards, saved queries, forwarding, teams, workflows, and Sentry apps.\"\n },\n {\n \"name\": \"project:admin\",\n \"description\": \"Delete and administer project-level resources such as projects, keys, hooks, filters, monitors, releases, rules, and symbol sources.\"\n },\n {\n \"name\": \"project:distribution\",\n \"description\": \"Read project build distribution artifacts.\"\n },\n {\n \"name\": \"project:read\",\n \"description\": \"Read project settings, events, environments, releases, monitors, replays, rules, keys, teams, and user feedback.\"\n },\n {\n \"name\": \"project:releases\",\n \"description\": \"Read and manage Sentry releases, deploys, release files, commits, and debug symbol files.\"\n },\n {\n \"name\": \"project:write\",\n \"description\": \"Create and update project settings, events, environments, debug files, hooks, keys, monitors, ownership, rules, symbol sources, teams, and user feedback.\"\n },\n {\n \"name\": \"team:admin\",\n \"description\": \"Administer teams, SCIM groups, external teams, and team memberships.\"\n },\n {\n \"name\": \"team:read\",\n \"description\": \"Read teams, SCIM groups, and team memberships.\"\n },\n {\n \"name\": \"team:write\",\n \"description\": \"Create and update teams, SCIM groups, external teams, and team memberships.\"\n }\n ],\n \"defaultPolicy\": {\n \"permissionDefault\": \"allow\",\n \"unknownPolicy\": \"allow\"\n }\n} as const satisfies FirewallPermissionDetailMetadata;\n"],"mappings":";;;;;;;;AAAA;AAMO,IAAM,6BAA6B;AAAA,EACxC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,eAAe;AAAA,IACb;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,EACnB;AACF;","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  downloadSlackFile,
8
8
  initSlackFileUpload,
9
9
  sendSlackMessage
10
- } from "./chunk-C3NCF7AC.js";
10
+ } from "./chunk-PHLVIRTN.js";
11
11
  import {
12
12
  withErrorHandler
13
13
  } from "./chunk-3F4RFLPX.js";
@@ -220,4 +220,4 @@ Examples:
220
220
  export {
221
221
  zeroSlackCommand
222
222
  };
223
- //# sourceMappingURL=slack-UE7PHE5Q.js.map
223
+ //# sourceMappingURL=slack-T7G7IOD7.js.map
@@ -0,0 +1,76 @@
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
+ // ../../packages/connectors/src/firewall-metadata/permission-details/strava.generated.ts
9
+ init_esm_shims();
10
+ var firewallPermissionMetadata = {
11
+ "type": "strava",
12
+ "label": "Strava",
13
+ "permissionCount": 13,
14
+ "permissions": [
15
+ {
16
+ "name": "activities:read",
17
+ "description": "Read athlete activities, including activity details, streams, comments, kudos, laps, zones, and activity history. Privacy zone data and Only You activities require Strava activity:read_all."
18
+ },
19
+ {
20
+ "name": "activities:write",
21
+ "description": "Create and update athlete activities."
22
+ },
23
+ {
24
+ "name": "athlete_stats:read",
25
+ "description": "Read athlete activity statistics."
26
+ },
27
+ {
28
+ "name": "clubs:read",
29
+ "description": "Read athlete club memberships and club activity, admin, and member information."
30
+ },
31
+ {
32
+ "name": "gear:read",
33
+ "description": "Read athlete gear details."
34
+ },
35
+ {
36
+ "name": "profile:read",
37
+ "description": "Read athlete profile and zone information. Restricted profile fields require Strava profile:read_all."
38
+ },
39
+ {
40
+ "name": "profile:write",
41
+ "description": "Update athlete profile fields."
42
+ },
43
+ {
44
+ "name": "routes:read",
45
+ "description": "Read athlete routes, route details, route exports, and route streams. Private routes require Strava read_all."
46
+ },
47
+ {
48
+ "name": "segment_effort_streams:read",
49
+ "description": "Read segment effort streams that require Strava read_all."
50
+ },
51
+ {
52
+ "name": "segment_efforts:read",
53
+ "description": "Read segment efforts and segment effort details."
54
+ },
55
+ {
56
+ "name": "segments:read",
57
+ "description": "Read segment exploration, starred segments, segment details, and segment streams. Private segments require Strava read_all."
58
+ },
59
+ {
60
+ "name": "segments:write",
61
+ "description": "Star and unstar segments for the athlete."
62
+ },
63
+ {
64
+ "name": "uploads:write",
65
+ "description": "Upload activities and read upload processing status."
66
+ }
67
+ ],
68
+ "defaultPolicy": {
69
+ "permissionDefault": "allow",
70
+ "unknownPolicy": "allow"
71
+ }
72
+ };
73
+ export {
74
+ firewallPermissionMetadata
75
+ };
76
+ //# sourceMappingURL=strava.generated-FDURULCZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/connectors/src/firewall-metadata/permission-details/strava.generated.ts"],"sourcesContent":["// Auto-generated by @vm0/firewalls-generator.\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate\n//\n// DO NOT EDIT THIS FILE MANUALLY.\nimport type { FirewallPermissionDetailMetadata } from \"../types\";\n\nexport const firewallPermissionMetadata = {\n \"type\": \"strava\",\n \"label\": \"Strava\",\n \"permissionCount\": 13,\n \"permissions\": [\n {\n \"name\": \"activities:read\",\n \"description\": \"Read athlete activities, including activity details, streams, comments, kudos, laps, zones, and activity history. Privacy zone data and Only You activities require Strava activity:read_all.\"\n },\n {\n \"name\": \"activities:write\",\n \"description\": \"Create and update athlete activities.\"\n },\n {\n \"name\": \"athlete_stats:read\",\n \"description\": \"Read athlete activity statistics.\"\n },\n {\n \"name\": \"clubs:read\",\n \"description\": \"Read athlete club memberships and club activity, admin, and member information.\"\n },\n {\n \"name\": \"gear:read\",\n \"description\": \"Read athlete gear details.\"\n },\n {\n \"name\": \"profile:read\",\n \"description\": \"Read athlete profile and zone information. Restricted profile fields require Strava profile:read_all.\"\n },\n {\n \"name\": \"profile:write\",\n \"description\": \"Update athlete profile fields.\"\n },\n {\n \"name\": \"routes:read\",\n \"description\": \"Read athlete routes, route details, route exports, and route streams. Private routes require Strava read_all.\"\n },\n {\n \"name\": \"segment_effort_streams:read\",\n \"description\": \"Read segment effort streams that require Strava read_all.\"\n },\n {\n \"name\": \"segment_efforts:read\",\n \"description\": \"Read segment efforts and segment effort details.\"\n },\n {\n \"name\": \"segments:read\",\n \"description\": \"Read segment exploration, starred segments, segment details, and segment streams. Private segments require Strava read_all.\"\n },\n {\n \"name\": \"segments:write\",\n \"description\": \"Star and unstar segments for the athlete.\"\n },\n {\n \"name\": \"uploads:write\",\n \"description\": \"Upload activities and read upload processing status.\"\n }\n ],\n \"defaultPolicy\": {\n \"permissionDefault\": \"allow\",\n \"unknownPolicy\": \"allow\"\n }\n} as const satisfies FirewallPermissionDetailMetadata;\n"],"mappings":";;;;;;;;AAAA;AAMO,IAAM,6BAA6B;AAAA,EACxC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,eAAe;AAAA,IACb;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,EACnB;AACF;","names":[]}
@@ -8,7 +8,7 @@ import {
8
8
  initTelegramFileUpload,
9
9
  listTelegramBots,
10
10
  sendTelegramMessage
11
- } from "./chunk-C3NCF7AC.js";
11
+ } from "./chunk-PHLVIRTN.js";
12
12
  import {
13
13
  withErrorHandler
14
14
  } from "./chunk-3F4RFLPX.js";
@@ -335,4 +335,4 @@ Examples:
335
335
  export {
336
336
  zeroTelegramCommand
337
337
  };
338
- //# sourceMappingURL=telegram-FMO5JNQL.js.map
338
+ //# sourceMappingURL=telegram-AIUOTF4A.js.map