@vm0/cli 9.249.1 → 9.249.2
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-PMWDKCSZ.js → agent-TOFXTWYP.js} +11 -10
- package/{agent-PMWDKCSZ.js.map → agent-TOFXTWYP.js.map} +1 -1
- package/{banking-S5RH46G5.js → banking-U7I6EJUO.js} +8 -7
- package/{banking-S5RH46G5.js.map → banking-U7I6EJUO.js.map} +1 -1
- package/{chat-2ZTZUIWC.js → chat-77EDGFMS.js} +9 -8
- package/{chat-2ZTZUIWC.js.map → chat-77EDGFMS.js.map} +1 -1
- package/{chunk-DIRAZ3YX.js → chunk-3VVCUQPB.js} +3 -3
- package/{chunk-DIRAZ3YX.js.map → chunk-3VVCUQPB.js.map} +1 -1
- package/{chunk-PLOJYRFL.js → chunk-4HN7U3JF.js} +40 -564
- package/chunk-4HN7U3JF.js.map +1 -0
- package/{chunk-FF5L22OE.js → chunk-5CZNUTFF.js} +3 -3
- package/chunk-A2NKQGRI.js +491 -0
- package/chunk-A2NKQGRI.js.map +1 -0
- package/{chunk-J2I5GYLR.js → chunk-AFNSFKAH.js} +5 -5
- package/{chunk-L63QVTYZ.js → chunk-BQOOTJNB.js} +27 -672
- package/chunk-BQOOTJNB.js.map +1 -0
- package/{chunk-KLIW3XK7.js → chunk-GPF7NSX7.js} +2 -2
- package/{chunk-HUMR2SA3.js → chunk-HSGQT7LT.js} +3 -3
- package/{chunk-SAW74AR6.js → chunk-JCLLQRCI.js} +3 -3
- package/{chunk-B3W2RUBP.js → chunk-LD4ZVU4O.js} +2 -2
- package/chunk-N6TDQYGF.js +678 -0
- package/chunk-N6TDQYGF.js.map +1 -0
- package/{chunk-KQN5YZZP.js → chunk-ROB3OE37.js} +10 -113
- package/chunk-ROB3OE37.js.map +1 -0
- package/{chunk-LTDQISD7.js → chunk-SB7EZ2ZO.js} +2 -2
- package/{chunk-RTYT3CSZ.js → chunk-UG5XA6KU.js} +2 -2
- package/{chunk-LKDE4AUC.js → chunk-UNQJRTJQ.js} +3 -3
- package/chunk-W75R7EZF.js +17 -0
- package/chunk-W75R7EZF.js.map +1 -0
- package/chunk-WDDZJGWL.js +32 -0
- package/chunk-WDDZJGWL.js.map +1 -0
- package/{chunk-JFY6GK7Y.js → chunk-X2545RBX.js} +2 -2
- package/{chunk-ZE2VIESK.js → chunk-X4DBCBU4.js} +2 -2
- package/{computer-use-GRK4TZYN.js → computer-use-BCGPVGWS.js} +7 -6
- package/{computer-use-GRK4TZYN.js.map → computer-use-BCGPVGWS.js.map} +1 -1
- package/{connector-2SVH4F2N.js → connector-CHZSI2LW.js} +14 -13
- package/{connector-2SVH4F2N.js.map → connector-CHZSI2LW.js.map} +1 -1
- package/credit-RWFBPKOS.js +166 -0
- package/credit-RWFBPKOS.js.map +1 -0
- package/{developer-support-RYTLIFUN.js → developer-support-IVR3HIP7.js} +8 -7
- package/{developer-support-RYTLIFUN.js.map → developer-support-IVR3HIP7.js.map} +1 -1
- package/{doctor-CS5TFE6A.js → doctor-KGWTXW2Q.js} +39 -13
- package/doctor-KGWTXW2Q.js.map +1 -0
- package/{esm-PZKPCIYJ.js → esm-GOCEMHJO.js} +3 -3
- package/{feishu-HFQIJDBU.js → feishu-PLF4P5OG.js} +8 -7
- package/{feishu-HFQIJDBU.js.map → feishu-PLF4P5OG.js.map} +1 -1
- package/{finance-56HIRALT.js → finance-LVFG3WWP.js} +8 -7
- package/{finance-56HIRALT.js.map → finance-LVFG3WWP.js.map} +1 -1
- package/{generate-4FEC4YVM.js → generate-4FIBMMJO.js} +77 -22
- package/generate-4FIBMMJO.js.map +1 -0
- package/{getMachineId-bsd-L73QENVB.js → getMachineId-bsd-SB7C44VX.js} +4 -4
- package/{getMachineId-darwin-TCCWKQ2S.js → getMachineId-darwin-R4BWY3CQ.js} +4 -4
- package/{getMachineId-linux-TJYYUZVM.js → getMachineId-linux-BR4HVNPW.js} +3 -3
- package/{getMachineId-unsupported-DPRVLH4Y.js → getMachineId-unsupported-FPGM635L.js} +3 -3
- package/{getMachineId-win-7EE436CJ.js → getMachineId-win-RB4JMF33.js} +4 -4
- package/{github-AALJ7IEM.js → github-WHNAVVG3.js} +8 -7
- package/{github-AALJ7IEM.js.map → github-WHNAVVG3.js.map} +1 -1
- package/{goal-CFSXEKHU.js → goal-G4J2BQ5Z.js} +8 -7
- package/{goal-CFSXEKHU.js.map → goal-G4J2BQ5Z.js.map} +1 -1
- package/{host-6NKXFQCO.js → host-3W6U2ZUP.js} +8 -7
- package/{host-6NKXFQCO.js.map → host-3W6U2ZUP.js.map} +1 -1
- package/{intro-MIVVJG7M.js → intro-PMHOBGDL.js} +3 -3
- package/{logs-F4KPELTF.js → logs-P7JLTGXY.js} +10 -9
- package/{logs-F4KPELTF.js.map → logs-P7JLTGXY.js.map} +1 -1
- package/{mail-RZTLZU3I.js → mail-LIAOXDD4.js} +12 -11
- package/{mail-RZTLZU3I.js.map → mail-LIAOXDD4.js.map} +1 -1
- package/{maps-QRHGR33R.js → maps-C4NOXSE7.js} +8 -7
- package/{maps-QRHGR33R.js.map → maps-C4NOXSE7.js.map} +1 -1
- package/{model-6N5VPIS5.js → model-I2MNQ5KC.js} +9 -8
- package/{model-6N5VPIS5.js.map → model-I2MNQ5KC.js.map} +1 -1
- package/{model-provider-UZO32ZTC.js → model-provider-AOCCHEMP.js} +9 -8
- package/{model-provider-UZO32ZTC.js.map → model-provider-AOCCHEMP.js.map} +1 -1
- package/{org-26ZL2W2U.js → org-MVBG3WXZ.js} +9 -8
- package/{org-26ZL2W2U.js.map → org-MVBG3WXZ.js.map} +1 -1
- package/package.json +1 -1
- package/{phone-QTRZLYIG.js → phone-4OZQFYHU.js} +8 -7
- package/{phone-QTRZLYIG.js.map → phone-4OZQFYHU.js.map} +1 -1
- package/{preference-JCFTTUBN.js → preference-H2A3WBGQ.js} +9 -8
- package/{preference-JCFTTUBN.js.map → preference-H2A3WBGQ.js.map} +1 -1
- package/{resource-64R7T4FF.js → resource-CPCQ6V6M.js} +9 -8
- package/{resource-64R7T4FF.js.map → resource-CPCQ6V6M.js.map} +1 -1
- package/{scrape-LVGJ56IS.js → scrape-6RMFDYAT.js} +8 -7
- package/{scrape-LVGJ56IS.js.map → scrape-6RMFDYAT.js.map} +1 -1
- package/{search-TRISF64L.js → search-HSQVSQZY.js} +10 -9
- package/{search-TRISF64L.js.map → search-HSQVSQZY.js.map} +1 -1
- package/{secret-UAJDU3SX.js → secret-S4D6CNOX.js} +9 -8
- package/{secret-UAJDU3SX.js.map → secret-S4D6CNOX.js.map} +1 -1
- package/{slack-PDOPNS5Z.js → slack-E3E2NIDZ.js} +50 -175
- package/slack-E3E2NIDZ.js.map +1 -0
- package/{teams-BL36IS5U.js → teams-CLEWT2LQ.js} +8 -7
- package/{teams-BL36IS5U.js.map → teams-CLEWT2LQ.js.map} +1 -1
- package/{telegram-X7YTUVNV.js → telegram-35FKKA4K.js} +8 -7
- package/{telegram-X7YTUVNV.js.map → telegram-35FKKA4K.js.map} +1 -1
- package/{undici-ZMFN7TNU.js → undici-YXSVPIYI.js} +2 -2
- package/upgrade-DNGUR42E.js +50 -0
- package/upgrade-DNGUR42E.js.map +1 -0
- package/{variable-EBCBNZSU.js → variable-C7RWUPV6.js} +9 -8
- package/{variable-EBCBNZSU.js.map → variable-C7RWUPV6.js.map} +1 -1
- package/{video-3HFJJJEE.js → video-JS5VOA2S.js} +9 -7
- package/{video-3HFJJJEE.js.map → video-JS5VOA2S.js.map} +1 -1
- package/{weather-Y37FKFKU.js → weather-5R2N5OX4.js} +8 -7
- package/{weather-Y37FKFKU.js.map → weather-5R2N5OX4.js.map} +1 -1
- package/{web-ZEWEVAI3.js → web-FXIIYCZ7.js} +10 -8
- package/{web-ZEWEVAI3.js.map → web-FXIIYCZ7.js.map} +1 -1
- package/{web-search-37SGCKB7.js → web-search-SZP7J4UM.js} +8 -7
- package/{web-search-37SGCKB7.js.map → web-search-SZP7J4UM.js.map} +1 -1
- package/{whoami-VZI6VS4C.js → whoami-J4FRN67A.js} +10 -9
- package/{whoami-VZI6VS4C.js.map → whoami-J4FRN67A.js.map} +1 -1
- package/{workflow-3WGBRMM5.js → workflow-HQHZKXB2.js} +9 -8
- package/{workflow-3WGBRMM5.js.map → workflow-HQHZKXB2.js.map} +1 -1
- package/zero.js +88 -61
- package/zero.js.map +1 -1
- package/chunk-KQN5YZZP.js.map +0 -1
- package/chunk-L63QVTYZ.js.map +0 -1
- package/chunk-LRHXR7JT.js +0 -33
- package/chunk-LRHXR7JT.js.map +0 -1
- package/chunk-PLOJYRFL.js.map +0 -1
- package/credit-LGMFDRFK.js +0 -128
- package/credit-LGMFDRFK.js.map +0 -1
- package/doctor-CS5TFE6A.js.map +0 -1
- package/generate-4FEC4YVM.js.map +0 -1
- package/slack-PDOPNS5Z.js.map +0 -1
- /package/{chunk-FF5L22OE.js.map → chunk-5CZNUTFF.js.map} +0 -0
- /package/{chunk-J2I5GYLR.js.map → chunk-AFNSFKAH.js.map} +0 -0
- /package/{chunk-KLIW3XK7.js.map → chunk-GPF7NSX7.js.map} +0 -0
- /package/{chunk-HUMR2SA3.js.map → chunk-HSGQT7LT.js.map} +0 -0
- /package/{chunk-SAW74AR6.js.map → chunk-JCLLQRCI.js.map} +0 -0
- /package/{chunk-B3W2RUBP.js.map → chunk-LD4ZVU4O.js.map} +0 -0
- /package/{chunk-LTDQISD7.js.map → chunk-SB7EZ2ZO.js.map} +0 -0
- /package/{chunk-RTYT3CSZ.js.map → chunk-UG5XA6KU.js.map} +0 -0
- /package/{chunk-LKDE4AUC.js.map → chunk-UNQJRTJQ.js.map} +0 -0
- /package/{chunk-JFY6GK7Y.js.map → chunk-X2545RBX.js.map} +0 -0
- /package/{chunk-ZE2VIESK.js.map → chunk-X4DBCBU4.js.map} +0 -0
- /package/{esm-PZKPCIYJ.js.map → esm-GOCEMHJO.js.map} +0 -0
- /package/{getMachineId-bsd-L73QENVB.js.map → getMachineId-bsd-SB7C44VX.js.map} +0 -0
- /package/{getMachineId-darwin-TCCWKQ2S.js.map → getMachineId-darwin-R4BWY3CQ.js.map} +0 -0
- /package/{getMachineId-linux-TJYYUZVM.js.map → getMachineId-linux-BR4HVNPW.js.map} +0 -0
- /package/{getMachineId-unsupported-DPRVLH4Y.js.map → getMachineId-unsupported-FPGM635L.js.map} +0 -0
- /package/{getMachineId-win-7EE436CJ.js.map → getMachineId-win-RB4JMF33.js.map} +0 -0
- /package/{intro-MIVVJG7M.js.map → intro-PMHOBGDL.js.map} +0 -0
- /package/{undici-ZMFN7TNU.js.map → undici-YXSVPIYI.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/mail/index.ts","../src/commands/zero/mail/connect.ts","../src/commands/zero/mail/shared.ts","../src/commands/zero/mail/link.ts","../src/commands/zero/mail/list.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { connectCommand } from \"./connect\";\nimport { linkCommand } from \"./link\";\nimport { listCommand } from \"./list\";\n\nexport const zeroMailCommand = new Command()\n .name(\"mail\")\n .description(\"Review linked Gmail drafts\")\n .addCommand(listCommand)\n .addCommand(connectCommand)\n .addCommand(linkCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n MAIL_CONNECTOR_REF,\n currentAgentId,\n parseMailProvider,\n} from \"./shared\";\n\ninterface ConnectOptions {\n readonly json?: boolean;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Get a connect or authorization link for a mail provider\")\n .argument(\"<provider>\", \"Mail provider: gmail or outlook\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .action(\n withErrorHandler(async (providerValue: string, options: ConnectOptions) => {\n const provider = parseMailProvider(providerValue);\n const agentId = currentAgentId();\n const connectorRef = MAIL_CONNECTOR_REF[provider];\n const [{ connectors }, agent, origin] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n getPlatformOrigin(),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n const connector = findConnectorStatusItem(connectors, connectorRef);\n if (!connector) {\n throw new Error(`${provider} is not available`);\n }\n\n const authorized = agent.authorizedTypes.has(connectorRef);\n const action =\n connector.connectionStatus === \"reconnect-required\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ? \"reconnect\"\n : connector.connected && !authorized\n ? \"authorize\"\n : !connector.connected\n ? \"connect\"\n : \"ready\";\n const url =\n action === \"reconnect\"\n ? connector.connectionStatus === \"scope-mismatch\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : `${origin}/connectors`\n : action === \"authorize\"\n ? `${origin}/connectors/${connectorRef}/authorize?agentId=${agentId}`\n : action === \"connect\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : null;\n\n if (options.json) {\n console.log(JSON.stringify({ provider, action, url }));\n return;\n }\n if (!url) {\n console.log(chalk.green(`✓ ${connector.label} is ready`));\n console.log(\n chalk.dim(` Sender: ${connector.connection?.externalEmail}`),\n );\n console.log(\n chalk.dim(\n \" After creating a Gmail draft: zero mail link <draft-id>\",\n ),\n );\n return;\n }\n const label =\n action === \"authorize\"\n ? `Authorize ${connector.label}`\n : action === \"reconnect\"\n ? `Reconnect ${connector.label}`\n : `Connect ${connector.label}`;\n console.log(`${label}: [${label}](${url})`);\n }),\n );\n","import type { ZeroMailProvider } from \"@vm0/api-contracts/contracts/zero-mail\";\n\nexport const MAIL_CONNECTOR_REF = {\n gmail: \"gmail\",\n outlook: \"outlook-mail\",\n} as const;\n\nexport function parseMailProvider(value: string): ZeroMailProvider {\n if (value === \"gmail\" || value === \"outlook\") {\n return value;\n }\n throw new Error(`Unsupported mail provider: ${value}`, {\n cause: new Error(\"Use gmail or outlook\"),\n });\n}\n\nexport function currentAgentId(): string {\n const agentId = process.env.ZERO_AGENT_ID?.trim();\n if (!agentId) {\n throw new Error(\"ZERO_AGENT_ID is not set\", {\n cause: new Error(\"Run this command from an active Zero agent run\"),\n });\n }\n return agentId;\n}\n","import { Command } from \"commander\";\n\nimport { linkZeroMailDraft } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { currentAgentId } from \"./shared\";\n\nfunction currentChatThreadId(): string {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!threadId) {\n throw new Error(\"ZERO_CHAT_THREAD_ID is not set\", {\n cause: new Error(\"Run this command from a Zero web chat thread\"),\n });\n }\n return threadId;\n}\n\nexport const linkCommand = new Command()\n .name(\"link\")\n .description(\"Link an existing Gmail draft to the current web chat\")\n .argument(\"<gmail-draft-id>\", \"Gmail draft ID\")\n .action(\n withErrorHandler(async (gmailDraftId: string) => {\n const result = await linkZeroMailDraft({\n threadId: currentChatThreadId(),\n agentId: currentAgentId(),\n gmailDraftId,\n });\n console.log(result.mailDraftUrl);\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { MAIL_CONNECTOR_REF, currentAgentId } from \"./shared\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Gmail and Outlook Mail availability for the current agent\")\n .action(\n withErrorHandler(async () => {\n const agentId = currentAgentId();\n const [{ connectors }, agent] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n\n const rows = Object.entries(MAIL_CONNECTOR_REF).map(\n ([provider, connectorRef]) => {\n const connector = findConnectorStatusItem(connectors, connectorRef);\n const authorized = agent.authorizedTypes.has(connectorRef);\n const ready =\n authorized &&\n connector?.connected === true &&\n connector.connectionStatus === \"connected\";\n const sender = authorized\n ? (connector?.connection?.externalEmail ?? \"-\")\n : \"-\";\n const status = ready\n ? chalk.green(\"ready\")\n : connector?.connectionStatus === \"reconnect-required\" ||\n connector?.connectionStatus === \"scope-mismatch\"\n ? chalk.yellow(\"reconnect\")\n : connector?.connected\n ? chalk.yellow(\"authorize\")\n : chalk.dim(\"connect\");\n return { provider, sender, status };\n },\n );\n\n const providerWidth = Math.max(\n \"PROVIDER\".length,\n ...rows.map((row) => {\n return row.provider.length;\n }),\n );\n const senderWidth = Math.max(\n \"SENDER\".length,\n ...rows.map((row) => {\n return row.sender.length;\n }),\n );\n console.log(\n chalk.dim(\n [\n \"PROVIDER\".padEnd(providerWidth),\n \"SENDER\".padEnd(senderWidth),\n \"STATUS\",\n ].join(\" \"),\n ),\n );\n for (const row of rows) {\n console.log(\n [\n row.provider.padEnd(providerWidth),\n row.sender.padEnd(senderWidth),\n row.status,\n ].join(\" \"),\n );\n }\n console.log();\n console.log(\n chalk.dim(\" Run: zero mail connect gmail|outlook when needed\"),\n );\n }),\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/mail/index.ts","../src/commands/zero/mail/connect.ts","../src/commands/zero/mail/shared.ts","../src/commands/zero/mail/link.ts","../src/commands/zero/mail/list.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { connectCommand } from \"./connect\";\nimport { linkCommand } from \"./link\";\nimport { listCommand } from \"./list\";\n\nexport const zeroMailCommand = new Command()\n .name(\"mail\")\n .description(\"Review linked Gmail drafts\")\n .addCommand(listCommand)\n .addCommand(connectCommand)\n .addCommand(linkCommand);\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { getPlatformOrigin } from \"../doctor/platform-url\";\nimport {\n MAIL_CONNECTOR_REF,\n currentAgentId,\n parseMailProvider,\n} from \"./shared\";\n\ninterface ConnectOptions {\n readonly json?: boolean;\n}\n\nexport const connectCommand = new Command()\n .name(\"connect\")\n .description(\"Get a connect or authorization link for a mail provider\")\n .argument(\"<provider>\", \"Mail provider: gmail or outlook\")\n .option(\"--json\", \"Print machine-readable JSON\")\n .action(\n withErrorHandler(async (providerValue: string, options: ConnectOptions) => {\n const provider = parseMailProvider(providerValue);\n const agentId = currentAgentId();\n const connectorRef = MAIL_CONNECTOR_REF[provider];\n const [{ connectors }, agent, origin] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n getPlatformOrigin(),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n const connector = findConnectorStatusItem(connectors, connectorRef);\n if (!connector) {\n throw new Error(`${provider} is not available`);\n }\n\n const authorized = agent.authorizedTypes.has(connectorRef);\n const action =\n connector.connectionStatus === \"reconnect-required\" ||\n connector.connectionStatus === \"scope-mismatch\"\n ? \"reconnect\"\n : connector.connected && !authorized\n ? \"authorize\"\n : !connector.connected\n ? \"connect\"\n : \"ready\";\n const url =\n action === \"reconnect\"\n ? connector.connectionStatus === \"scope-mismatch\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : `${origin}/connectors`\n : action === \"authorize\"\n ? `${origin}/connectors/${connectorRef}/authorize?agentId=${agentId}`\n : action === \"connect\"\n ? `${origin}/connectors/${connectorRef}/connect?agentId=${agentId}`\n : null;\n\n if (options.json) {\n console.log(JSON.stringify({ provider, action, url }));\n return;\n }\n if (!url) {\n console.log(chalk.green(`✓ ${connector.label} is ready`));\n console.log(\n chalk.dim(` Sender: ${connector.connection?.externalEmail}`),\n );\n console.log(\n chalk.dim(\n \" After creating a Gmail draft: zero mail link <draft-id>\",\n ),\n );\n return;\n }\n const label =\n action === \"authorize\"\n ? `Authorize ${connector.label}`\n : action === \"reconnect\"\n ? `Reconnect ${connector.label}`\n : `Connect ${connector.label}`;\n console.log(`${label}: [${label}](${url})`);\n }),\n );\n","import type { ZeroMailProvider } from \"@vm0/api-contracts/contracts/zero-mail\";\n\nexport const MAIL_CONNECTOR_REF = {\n gmail: \"gmail\",\n outlook: \"outlook-mail\",\n} as const;\n\nexport function parseMailProvider(value: string): ZeroMailProvider {\n if (value === \"gmail\" || value === \"outlook\") {\n return value;\n }\n throw new Error(`Unsupported mail provider: ${value}`, {\n cause: new Error(\"Use gmail or outlook\"),\n });\n}\n\nexport function currentAgentId(): string {\n const agentId = process.env.ZERO_AGENT_ID?.trim();\n if (!agentId) {\n throw new Error(\"ZERO_AGENT_ID is not set\", {\n cause: new Error(\"Run this command from an active Zero agent run\"),\n });\n }\n return agentId;\n}\n","import { Command } from \"commander\";\n\nimport { linkZeroMailDraft } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { currentAgentId } from \"./shared\";\n\nfunction currentChatThreadId(): string {\n const threadId = process.env.ZERO_CHAT_THREAD_ID?.trim();\n if (!threadId) {\n throw new Error(\"ZERO_CHAT_THREAD_ID is not set\", {\n cause: new Error(\"Run this command from a Zero web chat thread\"),\n });\n }\n return threadId;\n}\n\nexport const linkCommand = new Command()\n .name(\"link\")\n .description(\"Link an existing Gmail draft to the current web chat\")\n .argument(\"<gmail-draft-id>\", \"Gmail draft ID\")\n .action(\n withErrorHandler(async (gmailDraftId: string) => {\n const result = await linkZeroMailDraft({\n threadId: currentChatThreadId(),\n agentId: currentAgentId(),\n gmailDraftId,\n });\n console.log(result.mailDraftUrl);\n }),\n );\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { listZeroConnectorCatalogStatus } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport { resolveAgentContext } from \"../connector/agent-context\";\nimport { findConnectorStatusItem } from \"../connector/public-catalog\";\nimport { MAIL_CONNECTOR_REF, currentAgentId } from \"./shared\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List Gmail and Outlook Mail availability for the current agent\")\n .action(\n withErrorHandler(async () => {\n const agentId = currentAgentId();\n const [{ connectors }, agent] = await Promise.all([\n listZeroConnectorCatalogStatus(),\n resolveAgentContext(agentId),\n ]);\n if (!agent) {\n throw new Error(\"Agent context could not be loaded\");\n }\n\n const rows = Object.entries(MAIL_CONNECTOR_REF).map(\n ([provider, connectorRef]) => {\n const connector = findConnectorStatusItem(connectors, connectorRef);\n const authorized = agent.authorizedTypes.has(connectorRef);\n const ready =\n authorized &&\n connector?.connected === true &&\n connector.connectionStatus === \"connected\";\n const sender = authorized\n ? (connector?.connection?.externalEmail ?? \"-\")\n : \"-\";\n const status = ready\n ? chalk.green(\"ready\")\n : connector?.connectionStatus === \"reconnect-required\" ||\n connector?.connectionStatus === \"scope-mismatch\"\n ? chalk.yellow(\"reconnect\")\n : connector?.connected\n ? chalk.yellow(\"authorize\")\n : chalk.dim(\"connect\");\n return { provider, sender, status };\n },\n );\n\n const providerWidth = Math.max(\n \"PROVIDER\".length,\n ...rows.map((row) => {\n return row.provider.length;\n }),\n );\n const senderWidth = Math.max(\n \"SENDER\".length,\n ...rows.map((row) => {\n return row.sender.length;\n }),\n );\n console.log(\n chalk.dim(\n [\n \"PROVIDER\".padEnd(providerWidth),\n \"SENDER\".padEnd(senderWidth),\n \"STATUS\",\n ].join(\" \"),\n ),\n );\n for (const row of rows) {\n console.log(\n [\n row.provider.padEnd(providerWidth),\n row.sender.padEnd(senderWidth),\n row.status,\n ].join(\" \"),\n );\n }\n console.log();\n console.log(\n chalk.dim(\" Run: zero mail connect gmail|outlook when needed\"),\n );\n }),\n );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;ACAA;;;ACAA;AAEO,IAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,kBAAkB,OAAiC;AACjE,MAAI,UAAU,WAAW,UAAU,WAAW;AAC5C,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,8BAA8B,KAAK,IAAI;AAAA,IACrD,OAAO,IAAI,MAAM,sBAAsB;AAAA,EACzC,CAAC;AACH;AAEO,SAAS,iBAAyB;AACvC,QAAM,UAAU,QAAQ,IAAI,eAAe,KAAK;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4BAA4B;AAAA,MAC1C,OAAO,IAAI,MAAM,gDAAgD;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;ADNO,IAAM,iBAAiB,IAAI,QAAQ,EACvC,KAAK,SAAS,EACd,YAAY,yDAAyD,EACrE,SAAS,cAAc,iCAAiC,EACxD,OAAO,UAAU,6BAA6B,EAC9C;AAAA,EACC,iBAAiB,OAAO,eAAuB,YAA4B;AACzE,UAAM,WAAW,kBAAkB,aAAa;AAChD,UAAM,UAAU,eAAe;AAC/B,UAAM,eAAe,mBAAmB,QAAQ;AAChD,UAAM,CAAC,EAAE,WAAW,GAAG,OAAO,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxD,+BAA+B;AAAA,MAC/B,oBAAoB,OAAO;AAAA,MAC3B,kBAAkB;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,UAAM,YAAY,wBAAwB,YAAY,YAAY;AAClE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,GAAG,QAAQ,mBAAmB;AAAA,IAChD;AAEA,UAAM,aAAa,MAAM,gBAAgB,IAAI,YAAY;AACzD,UAAM,SACJ,UAAU,qBAAqB,wBAC/B,UAAU,qBAAqB,mBAC3B,cACA,UAAU,aAAa,CAAC,aACtB,cACA,CAAC,UAAU,YACT,YACA;AACV,UAAM,MACJ,WAAW,cACP,UAAU,qBAAqB,mBAC7B,GAAG,MAAM,eAAe,YAAY,oBAAoB,OAAO,KAC/D,GAAG,MAAM,gBACX,WAAW,cACT,GAAG,MAAM,eAAe,YAAY,sBAAsB,OAAO,KACjE,WAAW,YACT,GAAG,MAAM,eAAe,YAAY,oBAAoB,OAAO,KAC/D;AAEV,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,QAAQ,IAAI,CAAC,CAAC;AACrD;AAAA,IACF;AACA,QAAI,CAAC,KAAK;AACR,cAAQ,IAAI,eAAM,MAAM,UAAK,UAAU,KAAK,WAAW,CAAC;AACxD,cAAQ;AAAA,QACN,eAAM,IAAI,aAAa,UAAU,YAAY,aAAa,EAAE;AAAA,MAC9D;AACA,cAAQ;AAAA,QACN,eAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,QACJ,WAAW,cACP,aAAa,UAAU,KAAK,KAC5B,WAAW,cACT,aAAa,UAAU,KAAK,KAC5B,WAAW,UAAU,KAAK;AAClC,YAAQ,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,GAAG;AAAA,EAC5C,CAAC;AACH;;;AEtFF;AAMA,SAAS,sBAA8B;AACrC,QAAM,WAAW,QAAQ,IAAI,qBAAqB,KAAK;AACvD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kCAAkC;AAAA,MAChD,OAAO,IAAI,MAAM,8CAA8C;AAAA,IACjE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,cAAc,IAAI,QAAQ,EACpC,KAAK,MAAM,EACX,YAAY,sDAAsD,EAClE,SAAS,oBAAoB,gBAAgB,EAC7C;AAAA,EACC,iBAAiB,OAAO,iBAAyB;AAC/C,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,UAAU,oBAAoB;AAAA,MAC9B,SAAS,eAAe;AAAA,MACxB;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,OAAO,YAAY;AAAA,EACjC,CAAC;AACH;;;AC7BF;AASO,IAAM,cAAc,IAAI,QAAQ,EACpC,KAAK,MAAM,EACX,MAAM,IAAI,EACV,YAAY,gEAAgE,EAC5E;AAAA,EACC,iBAAiB,YAAY;AAC3B,UAAM,UAAU,eAAe;AAC/B,UAAM,CAAC,EAAE,WAAW,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,+BAA+B;AAAA,MAC/B,oBAAoB,OAAO;AAAA,IAC7B,CAAC;AACD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,OAAO,OAAO,QAAQ,kBAAkB,EAAE;AAAA,MAC9C,CAAC,CAAC,UAAU,YAAY,MAAM;AAC5B,cAAM,YAAY,wBAAwB,YAAY,YAAY;AAClE,cAAM,aAAa,MAAM,gBAAgB,IAAI,YAAY;AACzD,cAAM,QACJ,cACA,WAAW,cAAc,QACzB,UAAU,qBAAqB;AACjC,cAAM,SAAS,aACV,WAAW,YAAY,iBAAiB,MACzC;AACJ,cAAM,SAAS,QACX,eAAM,MAAM,OAAO,IACnB,WAAW,qBAAqB,wBAC9B,WAAW,qBAAqB,mBAChC,eAAM,OAAO,WAAW,IACxB,WAAW,YACT,eAAM,OAAO,WAAW,IACxB,eAAM,IAAI,SAAS;AAC3B,eAAO,EAAE,UAAU,QAAQ,OAAO;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK;AAAA,MACzB,WAAW;AAAA,MACX,GAAG,KAAK,IAAI,CAAC,QAAQ;AACnB,eAAO,IAAI,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AACA,UAAM,cAAc,KAAK;AAAA,MACvB,SAAS;AAAA,MACT,GAAG,KAAK,IAAI,CAAC,QAAQ;AACnB,eAAO,IAAI,OAAO;AAAA,MACpB,CAAC;AAAA,IACH;AACA,YAAQ;AAAA,MACN,eAAM;AAAA,QACJ;AAAA,UACE,WAAW,OAAO,aAAa;AAAA,UAC/B,SAAS,OAAO,WAAW;AAAA,UAC3B;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AACA,eAAW,OAAO,MAAM;AACtB,cAAQ;AAAA,QACN;AAAA,UACE,IAAI,SAAS,OAAO,aAAa;AAAA,UACjC,IAAI,OAAO,OAAO,WAAW;AAAA,UAC7B,IAAI;AAAA,QACN,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,eAAM,IAAI,oDAAoD;AAAA,IAChE;AAAA,EACF,CAAC;AACH;;;AJ5EK,IAAM,kBAAkB,IAAI,QAAQ,EACxC,KAAK,MAAM,EACX,YAAY,4BAA4B,EACxC,WAAW,WAAW,EACtB,WAAW,cAAc,EACzB,WAAW,WAAW;","names":[]}
|
|
@@ -3,20 +3,21 @@ import { createRequire as __createRequire } from "node:module";
|
|
|
3
3
|
const require = __createRequire(import.meta.url);
|
|
4
4
|
import {
|
|
5
5
|
callZeroMaps
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-ROB3OE37.js";
|
|
7
|
+
import "./chunk-N6TDQYGF.js";
|
|
8
|
+
import "./chunk-SB7EZ2ZO.js";
|
|
8
9
|
import {
|
|
9
10
|
source_default,
|
|
10
11
|
withErrorHandler
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-BQOOTJNB.js";
|
|
13
|
+
import "./chunk-A2NKQGRI.js";
|
|
13
14
|
import {
|
|
14
15
|
Command,
|
|
15
16
|
InvalidArgumentError
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-LD4ZVU4O.js";
|
|
17
18
|
import {
|
|
18
19
|
init_esm_shims
|
|
19
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-3VVCUQPB.js";
|
|
20
21
|
|
|
21
22
|
// src/commands/zero/maps/index.ts
|
|
22
23
|
init_esm_shims();
|
|
@@ -482,4 +483,4 @@ Notes:
|
|
|
482
483
|
export {
|
|
483
484
|
zeroMapsCommand
|
|
484
485
|
};
|
|
485
|
-
//# sourceMappingURL=maps-
|
|
486
|
+
//# sourceMappingURL=maps-C4NOXSE7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/maps/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\nimport { callZeroMaps, type ZeroMapsResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst TRAVEL_MODES = [\"driving\", \"walking\", \"bicycling\", \"transit\"] as const;\nconst PLACE_SEARCH_FIELDSETS = [\"pro\", \"enterprise\"] as const;\nconst PLACE_DETAIL_FIELDSETS = [\"essentials\", \"pro\", \"enterprise\"] as const;\nconst OSM_LAYERS = [\"roads\", \"buildings\", \"water\", \"parks\"] as const;\nconst OSM_STYLES = [\"standard\", \"guide\"] as const;\n\ntype TravelMode = (typeof TRAVEL_MODES)[number];\ntype PlaceSearchFieldset = (typeof PLACE_SEARCH_FIELDSETS)[number];\ntype PlaceDetailFieldset = (typeof PLACE_DETAIL_FIELDSETS)[number];\ntype OsmLayer = (typeof OSM_LAYERS)[number];\ntype OsmStyle = (typeof OSM_STYLES)[number];\n\ninterface JsonOption {\n json?: boolean;\n}\n\ninterface GeocodeOptions extends JsonOption {\n address: string;\n region?: string;\n}\n\ninterface ReverseGeocodeOptions extends JsonOption {\n lat: number;\n lng: number;\n}\n\ninterface DirectionsOptions extends JsonOption {\n origin: string;\n destination: string;\n mode: TravelMode;\n departureTime?: string;\n}\n\ninterface PlacesSearchOptions extends JsonOption {\n query: string;\n location?: string;\n radius?: number;\n limit: number;\n region?: string;\n fields: PlaceSearchFieldset;\n}\n\ninterface PlacesDetailsOptions extends JsonOption {\n placeId: string;\n fields: PlaceDetailFieldset;\n}\n\ninterface BBox {\n readonly west: number;\n readonly south: number;\n readonly east: number;\n readonly north: number;\n}\n\ninterface LatLng {\n readonly lat: number;\n readonly lng: number;\n}\n\ninterface OsmMarker extends LatLng {\n readonly label?: string;\n}\n\ninterface OsmAreaOptions extends JsonOption {\n bbox?: BBox;\n center?: LatLng;\n radius?: number;\n layers: readonly OsmLayer[];\n output?: string;\n}\n\ninterface OsmRenderOptions extends OsmAreaOptions {\n width: number;\n height: number;\n style: OsmStyle;\n title?: string;\n marker: readonly OsmMarker[];\n output: string;\n}\n\nfunction parseLatitude(value: string): number {\n const latitude = Number(value);\n if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new InvalidArgumentError(\"latitude must be a number from -90 to 90\");\n }\n return latitude;\n}\n\nfunction parseLongitude(value: string): number {\n const longitude = Number(value);\n if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new InvalidArgumentError(\n \"longitude must be a number from -180 to 180\",\n );\n }\n return longitude;\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\"value must be a positive integer\");\n }\n return parsed;\n}\n\nfunction parseLimit(value: string): number {\n const limit = parsePositiveInteger(value);\n if (limit > 20) {\n throw new InvalidArgumentError(\"limit must be between 1 and 20\");\n }\n return limit;\n}\n\nfunction parseIntegerInRange(value: string, min: number, max: number): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(\n `value must be an integer from ${min} to ${max}`,\n );\n }\n return parsed;\n}\n\nfunction parseTravelMode(value: string): TravelMode {\n if (TRAVEL_MODES.includes(value as TravelMode)) {\n return value as TravelMode;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${TRAVEL_MODES.join(\", \")}`,\n );\n}\n\nfunction parsePlaceSearchFields(value: string): PlaceSearchFieldset {\n if (PLACE_SEARCH_FIELDSETS.includes(value as PlaceSearchFieldset)) {\n return value as PlaceSearchFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_SEARCH_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parsePlaceDetailFields(value: string): PlaceDetailFieldset {\n if (PLACE_DETAIL_FIELDSETS.includes(value as PlaceDetailFieldset)) {\n return value as PlaceDetailFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_DETAIL_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parseBBox(value: string): BBox {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 4) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const [westRaw, southRaw, eastRaw, northRaw] = parts;\n if (!westRaw || !southRaw || !eastRaw || !northRaw) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const bbox = {\n west: parseLongitude(westRaw),\n south: parseLatitude(southRaw),\n east: parseLongitude(eastRaw),\n north: parseLatitude(northRaw),\n };\n if (bbox.east <= bbox.west || bbox.north <= bbox.south) {\n throw new InvalidArgumentError(\n \"bbox east/north must be greater than west/south\",\n );\n }\n return bbox;\n}\n\nfunction parseLatLng(value: string): LatLng {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidArgumentError(\"coordinates must be lat,lng\");\n }\n return {\n lat: parseLatitude(parts[0]),\n lng: parseLongitude(parts[1]),\n };\n}\n\nfunction parseOsmLayers(value: string): readonly OsmLayer[] {\n const layers = [\n ...new Set(\n value\n .split(\",\")\n .map((layer) => {\n return layer.trim();\n })\n .filter(Boolean),\n ),\n ];\n if (layers.length === 0) {\n throw new InvalidArgumentError(\"layers must include at least one value\");\n }\n const invalid = layers.find((layer) => {\n return !OSM_LAYERS.includes(layer as OsmLayer);\n });\n if (invalid) {\n throw new InvalidArgumentError(\n `layers must be drawn from: ${OSM_LAYERS.join(\", \")}`,\n );\n }\n return layers as readonly OsmLayer[];\n}\n\nfunction parseOsmStyle(value: string): OsmStyle {\n if (OSM_STYLES.includes(value as OsmStyle)) {\n return value as OsmStyle;\n }\n throw new InvalidArgumentError(\n `style must be one of: ${OSM_STYLES.join(\", \")}`,\n );\n}\n\nfunction parseOsmMarker(value: string): OsmMarker {\n const [latRaw, lngRaw, ...labelParts] = value.split(\",\");\n if (!latRaw?.trim() || !lngRaw?.trim()) {\n throw new InvalidArgumentError(\"marker must be lat,lng or lat,lng,label\");\n }\n const label = labelParts.join(\",\").trim();\n return {\n lat: parseLatitude(latRaw.trim()),\n lng: parseLongitude(lngRaw.trim()),\n ...(label ? { label } : {}),\n };\n}\n\nfunction collectOsmMarker(\n value: string,\n previous: readonly OsmMarker[],\n): readonly OsmMarker[] {\n return [...previous, parseOsmMarker(value)];\n}\n\nfunction osmAreaPayload(options: OsmAreaOptions): Record<string, unknown> {\n const hasBbox = options.bbox !== undefined;\n const hasCenterRadius =\n options.center !== undefined && options.radius !== undefined;\n if (hasBbox === hasCenterRadius) {\n throw new Error(\"Provide either --bbox or --center with --radius\");\n }\n return {\n ...(options.bbox ? { bbox: options.bbox } : {}),\n ...(options.center ? { center: options.center } : {}),\n ...(options.radius !== undefined ? { radiusMeters: options.radius } : {}),\n layers: options.layers,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resultRecord(response: ZeroMapsResponse): Record<string, unknown> {\n if (!isRecord(response.result)) {\n throw new Error(\"Zero Maps response did not include an object result\");\n }\n return response.result;\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction numberField(\n value: Record<string, unknown>,\n key: string,\n): number | undefined {\n const field = value[key];\n return typeof field === \"number\" ? field : undefined;\n}\n\nasync function writeOutputFile(\n outputPath: string,\n content: string | Buffer,\n): Promise<void> {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, content);\n}\n\nasync function writeOsmGeoJson(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n if (!(\"geojson\" in result)) {\n throw new Error(\"Zero Maps OSM download response did not include geojson\");\n }\n await writeOutputFile(\n outputPath,\n `${JSON.stringify(result.geojson, null, 2)}\\n`,\n );\n}\n\nasync function writeOsmPng(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n const image = result.image;\n if (!isRecord(image) || typeof image.base64 !== \"string\") {\n throw new Error(\n \"Zero Maps OSM render response did not include a PNG image\",\n );\n }\n await writeOutputFile(outputPath, Buffer.from(image.base64, \"base64\"));\n}\n\nfunction renderMapsMetadata(response: ZeroMapsResponse): void {\n if (response.provider) {\n console.log(chalk.dim(` Provider: ${response.provider}`));\n }\n if (response.billingCategory) {\n console.log(chalk.dim(` Billing category: ${response.billingCategory}`));\n }\n if (response.billingQuantity !== undefined) {\n console.log(chalk.dim(` Billing quantity: ${response.billingQuantity}`));\n }\n if (response.creditsCharged !== undefined) {\n console.log(chalk.dim(` Credits charged: ${response.creditsCharged}`));\n }\n}\n\nfunction renderMapsResponse(label: string, response: ZeroMapsResponse): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = response.result ?? response;\n console.log(JSON.stringify(result, null, 2));\n}\n\nfunction renderOsmFileResponse(\n label: string,\n response: ZeroMapsResponse,\n outputPath: string,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = isRecord(response.result) ? response.result : {};\n const featureCount = numberField(result, \"featureCount\");\n const attribution = stringField(result, \"attribution\");\n if (featureCount !== undefined) {\n console.log(chalk.dim(` Features: ${featureCount}`));\n }\n if (attribution) {\n console.log(chalk.dim(` Attribution: ${attribution}`));\n }\n console.log(chalk.dim(` Output: ${outputPath}`));\n}\n\nasync function runMapsRequest(\n label: string,\n endpoint:\n | \"geocode\"\n | \"reverse-geocode\"\n | \"directions\"\n | \"places/search\"\n | \"places/details\"\n | \"osm/download\"\n | \"osm/render\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroMaps(endpoint, payload);\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n renderMapsResponse(label, response);\n}\n\nconst geocodeCommand = new Command()\n .name(\"geocode\")\n .description(\"Convert an address into coordinates\")\n .requiredOption(\"--address <address>\", \"Address to geocode\")\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: GeocodeOptions) => {\n await runMapsRequest(\n \"Geocode completed\",\n \"geocode\",\n { address: options.address, region: options.region },\n options,\n );\n }),\n );\n\nconst reverseGeocodeCommand = new Command()\n .name(\"reverse-geocode\")\n .description(\"Convert coordinates into an address\")\n .requiredOption(\"--lat <number>\", \"Latitude\", parseLatitude)\n .requiredOption(\"--lng <number>\", \"Longitude\", parseLongitude)\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: ReverseGeocodeOptions) => {\n await runMapsRequest(\n \"Reverse geocode completed\",\n \"reverse-geocode\",\n { lat: options.lat, lng: options.lng },\n options,\n );\n }),\n );\n\nconst directionsCommand = new Command()\n .name(\"directions\")\n .description(\"Get a route between two places\")\n .requiredOption(\n \"--origin <place>\",\n \"Origin address, coordinates, or place ID\",\n )\n .requiredOption(\n \"--destination <place>\",\n \"Destination address, coordinates, or place ID\",\n )\n .option(\n \"--mode <mode>\",\n \"Travel mode: driving, walking, bicycling, or transit\",\n parseTravelMode,\n \"driving\",\n )\n .option(\"--departure-time <time>\", \"ISO departure time or provider keyword\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: DirectionsOptions) => {\n await runMapsRequest(\n \"Directions completed\",\n \"directions\",\n {\n origin: options.origin,\n destination: options.destination,\n mode: options.mode,\n departureTime: options.departureTime,\n },\n options,\n );\n }),\n );\n\nconst placesSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search for places\")\n .requiredOption(\"--query <query>\", \"Place search query\")\n .option(\"--location <lat,lng>\", \"Optional location bias\")\n .option(\n \"--radius <meters>\",\n \"Optional search radius in meters\",\n parsePositiveInteger,\n )\n .option(\n \"--limit <n>\",\n \"Maximum places to return, from 1 to 20\",\n parseLimit,\n 5,\n )\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\n \"--fields <fields>\",\n \"Field set: pro or enterprise\",\n parsePlaceSearchFields,\n \"pro\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesSearchOptions) => {\n await runMapsRequest(\n \"Places search completed\",\n \"places/search\",\n {\n query: options.query,\n location: options.location,\n radius: options.radius,\n limit: options.limit,\n region: options.region,\n fields: options.fields,\n },\n options,\n );\n }),\n );\n\nconst placesDetailsCommand = new Command()\n .name(\"details\")\n .description(\"Get details for a place\")\n .requiredOption(\"--place-id <id>\", \"Provider place ID\")\n .option(\n \"--fields <fields>\",\n \"Field set: essentials, pro, or enterprise\",\n parsePlaceDetailFields,\n \"essentials\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesDetailsOptions) => {\n await runMapsRequest(\n \"Place details completed\",\n \"places/details\",\n { placeId: options.placeId, fields: options.fields },\n options,\n );\n }),\n );\n\nconst osmDownloadCommand = new Command()\n .name(\"download\")\n .description(\"Download OpenStreetMap vector features as GeoJSON\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\"--output <path>\", \"Write GeoJSON to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmAreaOptions) => {\n const response = await callZeroMaps(\n \"osm/download\",\n osmAreaPayload(options),\n );\n if (options.output) {\n await writeOsmGeoJson(options.output, response);\n }\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n if (options.output) {\n renderOsmFileResponse(\n \"OSM download completed\",\n response,\n options.output,\n );\n return;\n }\n renderMapsResponse(\"OSM download completed\", response);\n }),\n );\n\nconst osmRenderCommand = new Command()\n .name(\"render\")\n .description(\"Render OpenStreetMap vector features to PNG\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\n \"--width <px>\",\n \"PNG width in pixels, from 320 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 320, 2_048);\n },\n 1_536,\n )\n .option(\n \"--height <px>\",\n \"PNG height in pixels, from 240 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 240, 2_048);\n },\n 1_024,\n )\n .option(\n \"--style <style>\",\n \"Render style: standard or guide\",\n parseOsmStyle,\n \"standard\",\n )\n .option(\"--title <text>\", \"Optional title drawn onto the PNG\")\n .option(\n \"--marker <lat,lng[,label]>\",\n \"Marker to draw; repeat for multiple markers\",\n collectOsmMarker,\n [],\n )\n .requiredOption(\"--output <path>\", \"Write PNG to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmRenderOptions) => {\n const response = await callZeroMaps(\"osm/render\", {\n ...osmAreaPayload(options),\n width: options.width,\n height: options.height,\n style: options.style,\n title: options.title,\n markers: options.marker,\n });\n await writeOsmPng(options.output, response);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderOsmFileResponse(\"OSM render completed\", response, options.output);\n }),\n );\n\nconst osmCommand = new Command()\n .name(\"osm\")\n .description(\"Download and render OpenStreetMap data\")\n .addCommand(osmDownloadCommand)\n .addCommand(osmRenderCommand);\n\nconst placesCommand = new Command()\n .name(\"places\")\n .description(\"Search places and fetch place details\")\n .addCommand(placesSearchCommand)\n .addCommand(placesDetailsCommand);\n\nexport const zeroMapsCommand = new Command()\n .name(\"maps\")\n .description(\"Use managed zero maps services\")\n .addCommand(geocodeCommand)\n .addCommand(reverseGeocodeCommand)\n .addCommand(directionsCommand)\n .addCommand(placesCommand)\n .addCommand(osmCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Geocode address: zero maps geocode --address \"1 Infinite Loop, Cupertino\" --json\n Get route: zero maps directions --origin \"SFO\" --destination \"Mountain View\" --mode driving --json\n Search places: zero maps places search --query \"coffee near Union Square SF\" --limit 5 --json\n Enterprise search: zero maps places search --query \"restaurants in SoMa\" --fields enterprise --json\n Place details: zero maps places details --place-id <id> --fields essentials --json\n Enterprise details: zero maps places details --place-id <id> --fields enterprise --json\n Download OSM data: zero maps osm download --bbox -122.43,37.76,-122.40,37.79 --output map.geojson\n Render OSM PNG: zero maps osm render --center 37.7749,-122.4194 --radius 1200 --output map.png\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires maps:read capability) or a CLI token\n - Google Maps and OpenStreetMap calls and credit billing happen on the vm0 API server\n - Use --fields essentials for place details unless paid fields are required`,\n );\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/maps/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\nimport chalk from \"chalk\";\nimport { callZeroMaps, type ZeroMapsResponse } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\n\nconst TRAVEL_MODES = [\"driving\", \"walking\", \"bicycling\", \"transit\"] as const;\nconst PLACE_SEARCH_FIELDSETS = [\"pro\", \"enterprise\"] as const;\nconst PLACE_DETAIL_FIELDSETS = [\"essentials\", \"pro\", \"enterprise\"] as const;\nconst OSM_LAYERS = [\"roads\", \"buildings\", \"water\", \"parks\"] as const;\nconst OSM_STYLES = [\"standard\", \"guide\"] as const;\n\ntype TravelMode = (typeof TRAVEL_MODES)[number];\ntype PlaceSearchFieldset = (typeof PLACE_SEARCH_FIELDSETS)[number];\ntype PlaceDetailFieldset = (typeof PLACE_DETAIL_FIELDSETS)[number];\ntype OsmLayer = (typeof OSM_LAYERS)[number];\ntype OsmStyle = (typeof OSM_STYLES)[number];\n\ninterface JsonOption {\n json?: boolean;\n}\n\ninterface GeocodeOptions extends JsonOption {\n address: string;\n region?: string;\n}\n\ninterface ReverseGeocodeOptions extends JsonOption {\n lat: number;\n lng: number;\n}\n\ninterface DirectionsOptions extends JsonOption {\n origin: string;\n destination: string;\n mode: TravelMode;\n departureTime?: string;\n}\n\ninterface PlacesSearchOptions extends JsonOption {\n query: string;\n location?: string;\n radius?: number;\n limit: number;\n region?: string;\n fields: PlaceSearchFieldset;\n}\n\ninterface PlacesDetailsOptions extends JsonOption {\n placeId: string;\n fields: PlaceDetailFieldset;\n}\n\ninterface BBox {\n readonly west: number;\n readonly south: number;\n readonly east: number;\n readonly north: number;\n}\n\ninterface LatLng {\n readonly lat: number;\n readonly lng: number;\n}\n\ninterface OsmMarker extends LatLng {\n readonly label?: string;\n}\n\ninterface OsmAreaOptions extends JsonOption {\n bbox?: BBox;\n center?: LatLng;\n radius?: number;\n layers: readonly OsmLayer[];\n output?: string;\n}\n\ninterface OsmRenderOptions extends OsmAreaOptions {\n width: number;\n height: number;\n style: OsmStyle;\n title?: string;\n marker: readonly OsmMarker[];\n output: string;\n}\n\nfunction parseLatitude(value: string): number {\n const latitude = Number(value);\n if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new InvalidArgumentError(\"latitude must be a number from -90 to 90\");\n }\n return latitude;\n}\n\nfunction parseLongitude(value: string): number {\n const longitude = Number(value);\n if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new InvalidArgumentError(\n \"longitude must be a number from -180 to 180\",\n );\n }\n return longitude;\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\"value must be a positive integer\");\n }\n return parsed;\n}\n\nfunction parseLimit(value: string): number {\n const limit = parsePositiveInteger(value);\n if (limit > 20) {\n throw new InvalidArgumentError(\"limit must be between 1 and 20\");\n }\n return limit;\n}\n\nfunction parseIntegerInRange(value: string, min: number, max: number): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(\n `value must be an integer from ${min} to ${max}`,\n );\n }\n return parsed;\n}\n\nfunction parseTravelMode(value: string): TravelMode {\n if (TRAVEL_MODES.includes(value as TravelMode)) {\n return value as TravelMode;\n }\n throw new InvalidArgumentError(\n `mode must be one of: ${TRAVEL_MODES.join(\", \")}`,\n );\n}\n\nfunction parsePlaceSearchFields(value: string): PlaceSearchFieldset {\n if (PLACE_SEARCH_FIELDSETS.includes(value as PlaceSearchFieldset)) {\n return value as PlaceSearchFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_SEARCH_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parsePlaceDetailFields(value: string): PlaceDetailFieldset {\n if (PLACE_DETAIL_FIELDSETS.includes(value as PlaceDetailFieldset)) {\n return value as PlaceDetailFieldset;\n }\n throw new InvalidArgumentError(\n `fields must be one of: ${PLACE_DETAIL_FIELDSETS.join(\", \")}`,\n );\n}\n\nfunction parseBBox(value: string): BBox {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 4) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const [westRaw, southRaw, eastRaw, northRaw] = parts;\n if (!westRaw || !southRaw || !eastRaw || !northRaw) {\n throw new InvalidArgumentError(\"bbox must be west,south,east,north\");\n }\n const bbox = {\n west: parseLongitude(westRaw),\n south: parseLatitude(southRaw),\n east: parseLongitude(eastRaw),\n north: parseLatitude(northRaw),\n };\n if (bbox.east <= bbox.west || bbox.north <= bbox.south) {\n throw new InvalidArgumentError(\n \"bbox east/north must be greater than west/south\",\n );\n }\n return bbox;\n}\n\nfunction parseLatLng(value: string): LatLng {\n const parts = value.split(\",\").map((part) => {\n return part.trim();\n });\n if (parts.length !== 2 || !parts[0] || !parts[1]) {\n throw new InvalidArgumentError(\"coordinates must be lat,lng\");\n }\n return {\n lat: parseLatitude(parts[0]),\n lng: parseLongitude(parts[1]),\n };\n}\n\nfunction parseOsmLayers(value: string): readonly OsmLayer[] {\n const layers = [\n ...new Set(\n value\n .split(\",\")\n .map((layer) => {\n return layer.trim();\n })\n .filter(Boolean),\n ),\n ];\n if (layers.length === 0) {\n throw new InvalidArgumentError(\"layers must include at least one value\");\n }\n const invalid = layers.find((layer) => {\n return !OSM_LAYERS.includes(layer as OsmLayer);\n });\n if (invalid) {\n throw new InvalidArgumentError(\n `layers must be drawn from: ${OSM_LAYERS.join(\", \")}`,\n );\n }\n return layers as readonly OsmLayer[];\n}\n\nfunction parseOsmStyle(value: string): OsmStyle {\n if (OSM_STYLES.includes(value as OsmStyle)) {\n return value as OsmStyle;\n }\n throw new InvalidArgumentError(\n `style must be one of: ${OSM_STYLES.join(\", \")}`,\n );\n}\n\nfunction parseOsmMarker(value: string): OsmMarker {\n const [latRaw, lngRaw, ...labelParts] = value.split(\",\");\n if (!latRaw?.trim() || !lngRaw?.trim()) {\n throw new InvalidArgumentError(\"marker must be lat,lng or lat,lng,label\");\n }\n const label = labelParts.join(\",\").trim();\n return {\n lat: parseLatitude(latRaw.trim()),\n lng: parseLongitude(lngRaw.trim()),\n ...(label ? { label } : {}),\n };\n}\n\nfunction collectOsmMarker(\n value: string,\n previous: readonly OsmMarker[],\n): readonly OsmMarker[] {\n return [...previous, parseOsmMarker(value)];\n}\n\nfunction osmAreaPayload(options: OsmAreaOptions): Record<string, unknown> {\n const hasBbox = options.bbox !== undefined;\n const hasCenterRadius =\n options.center !== undefined && options.radius !== undefined;\n if (hasBbox === hasCenterRadius) {\n throw new Error(\"Provide either --bbox or --center with --radius\");\n }\n return {\n ...(options.bbox ? { bbox: options.bbox } : {}),\n ...(options.center ? { center: options.center } : {}),\n ...(options.radius !== undefined ? { radiusMeters: options.radius } : {}),\n layers: options.layers,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resultRecord(response: ZeroMapsResponse): Record<string, unknown> {\n if (!isRecord(response.result)) {\n throw new Error(\"Zero Maps response did not include an object result\");\n }\n return response.result;\n}\n\nfunction stringField(\n value: Record<string, unknown>,\n key: string,\n): string | undefined {\n const field = value[key];\n return typeof field === \"string\" ? field : undefined;\n}\n\nfunction numberField(\n value: Record<string, unknown>,\n key: string,\n): number | undefined {\n const field = value[key];\n return typeof field === \"number\" ? field : undefined;\n}\n\nasync function writeOutputFile(\n outputPath: string,\n content: string | Buffer,\n): Promise<void> {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, content);\n}\n\nasync function writeOsmGeoJson(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n if (!(\"geojson\" in result)) {\n throw new Error(\"Zero Maps OSM download response did not include geojson\");\n }\n await writeOutputFile(\n outputPath,\n `${JSON.stringify(result.geojson, null, 2)}\\n`,\n );\n}\n\nasync function writeOsmPng(\n outputPath: string,\n response: ZeroMapsResponse,\n): Promise<void> {\n const result = resultRecord(response);\n const image = result.image;\n if (!isRecord(image) || typeof image.base64 !== \"string\") {\n throw new Error(\n \"Zero Maps OSM render response did not include a PNG image\",\n );\n }\n await writeOutputFile(outputPath, Buffer.from(image.base64, \"base64\"));\n}\n\nfunction renderMapsMetadata(response: ZeroMapsResponse): void {\n if (response.provider) {\n console.log(chalk.dim(` Provider: ${response.provider}`));\n }\n if (response.billingCategory) {\n console.log(chalk.dim(` Billing category: ${response.billingCategory}`));\n }\n if (response.billingQuantity !== undefined) {\n console.log(chalk.dim(` Billing quantity: ${response.billingQuantity}`));\n }\n if (response.creditsCharged !== undefined) {\n console.log(chalk.dim(` Credits charged: ${response.creditsCharged}`));\n }\n}\n\nfunction renderMapsResponse(label: string, response: ZeroMapsResponse): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = response.result ?? response;\n console.log(JSON.stringify(result, null, 2));\n}\n\nfunction renderOsmFileResponse(\n label: string,\n response: ZeroMapsResponse,\n outputPath: string,\n): void {\n console.log(chalk.green(`✓ ${label}`));\n renderMapsMetadata(response);\n\n const result = isRecord(response.result) ? response.result : {};\n const featureCount = numberField(result, \"featureCount\");\n const attribution = stringField(result, \"attribution\");\n if (featureCount !== undefined) {\n console.log(chalk.dim(` Features: ${featureCount}`));\n }\n if (attribution) {\n console.log(chalk.dim(` Attribution: ${attribution}`));\n }\n console.log(chalk.dim(` Output: ${outputPath}`));\n}\n\nasync function runMapsRequest(\n label: string,\n endpoint:\n | \"geocode\"\n | \"reverse-geocode\"\n | \"directions\"\n | \"places/search\"\n | \"places/details\"\n | \"osm/download\"\n | \"osm/render\",\n payload: Record<string, unknown>,\n options: JsonOption,\n): Promise<void> {\n const response = await callZeroMaps(endpoint, payload);\n\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n\n renderMapsResponse(label, response);\n}\n\nconst geocodeCommand = new Command()\n .name(\"geocode\")\n .description(\"Convert an address into coordinates\")\n .requiredOption(\"--address <address>\", \"Address to geocode\")\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: GeocodeOptions) => {\n await runMapsRequest(\n \"Geocode completed\",\n \"geocode\",\n { address: options.address, region: options.region },\n options,\n );\n }),\n );\n\nconst reverseGeocodeCommand = new Command()\n .name(\"reverse-geocode\")\n .description(\"Convert coordinates into an address\")\n .requiredOption(\"--lat <number>\", \"Latitude\", parseLatitude)\n .requiredOption(\"--lng <number>\", \"Longitude\", parseLongitude)\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: ReverseGeocodeOptions) => {\n await runMapsRequest(\n \"Reverse geocode completed\",\n \"reverse-geocode\",\n { lat: options.lat, lng: options.lng },\n options,\n );\n }),\n );\n\nconst directionsCommand = new Command()\n .name(\"directions\")\n .description(\"Get a route between two places\")\n .requiredOption(\n \"--origin <place>\",\n \"Origin address, coordinates, or place ID\",\n )\n .requiredOption(\n \"--destination <place>\",\n \"Destination address, coordinates, or place ID\",\n )\n .option(\n \"--mode <mode>\",\n \"Travel mode: driving, walking, bicycling, or transit\",\n parseTravelMode,\n \"driving\",\n )\n .option(\"--departure-time <time>\", \"ISO departure time or provider keyword\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: DirectionsOptions) => {\n await runMapsRequest(\n \"Directions completed\",\n \"directions\",\n {\n origin: options.origin,\n destination: options.destination,\n mode: options.mode,\n departureTime: options.departureTime,\n },\n options,\n );\n }),\n );\n\nconst placesSearchCommand = new Command()\n .name(\"search\")\n .description(\"Search for places\")\n .requiredOption(\"--query <query>\", \"Place search query\")\n .option(\"--location <lat,lng>\", \"Optional location bias\")\n .option(\n \"--radius <meters>\",\n \"Optional search radius in meters\",\n parsePositiveInteger,\n )\n .option(\n \"--limit <n>\",\n \"Maximum places to return, from 1 to 20\",\n parseLimit,\n 5,\n )\n .option(\"--region <code>\", \"Optional region bias, such as US or CN\")\n .option(\n \"--fields <fields>\",\n \"Field set: pro or enterprise\",\n parsePlaceSearchFields,\n \"pro\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesSearchOptions) => {\n await runMapsRequest(\n \"Places search completed\",\n \"places/search\",\n {\n query: options.query,\n location: options.location,\n radius: options.radius,\n limit: options.limit,\n region: options.region,\n fields: options.fields,\n },\n options,\n );\n }),\n );\n\nconst placesDetailsCommand = new Command()\n .name(\"details\")\n .description(\"Get details for a place\")\n .requiredOption(\"--place-id <id>\", \"Provider place ID\")\n .option(\n \"--fields <fields>\",\n \"Field set: essentials, pro, or enterprise\",\n parsePlaceDetailFields,\n \"essentials\",\n )\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: PlacesDetailsOptions) => {\n await runMapsRequest(\n \"Place details completed\",\n \"places/details\",\n { placeId: options.placeId, fields: options.fields },\n options,\n );\n }),\n );\n\nconst osmDownloadCommand = new Command()\n .name(\"download\")\n .description(\"Download OpenStreetMap vector features as GeoJSON\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\"--output <path>\", \"Write GeoJSON to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmAreaOptions) => {\n const response = await callZeroMaps(\n \"osm/download\",\n osmAreaPayload(options),\n );\n if (options.output) {\n await writeOsmGeoJson(options.output, response);\n }\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n if (options.output) {\n renderOsmFileResponse(\n \"OSM download completed\",\n response,\n options.output,\n );\n return;\n }\n renderMapsResponse(\"OSM download completed\", response);\n }),\n );\n\nconst osmRenderCommand = new Command()\n .name(\"render\")\n .description(\"Render OpenStreetMap vector features to PNG\")\n .option(\n \"--bbox <west,south,east,north>\",\n \"Bounding box in WGS84 coordinates\",\n parseBBox,\n )\n .option(\n \"--center <lat,lng>\",\n \"Center point in WGS84 coordinates\",\n parseLatLng,\n )\n .option(\n \"--radius <meters>\",\n \"Radius in meters when using --center\",\n parsePositiveInteger,\n )\n .option(\n \"--layers <layers>\",\n \"Comma-separated layers: roads, buildings, water, parks\",\n parseOsmLayers,\n OSM_LAYERS,\n )\n .option(\n \"--width <px>\",\n \"PNG width in pixels, from 320 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 320, 2_048);\n },\n 1_536,\n )\n .option(\n \"--height <px>\",\n \"PNG height in pixels, from 240 to 2048\",\n (value) => {\n return parseIntegerInRange(value, 240, 2_048);\n },\n 1_024,\n )\n .option(\n \"--style <style>\",\n \"Render style: standard or guide\",\n parseOsmStyle,\n \"standard\",\n )\n .option(\"--title <text>\", \"Optional title drawn onto the PNG\")\n .option(\n \"--marker <lat,lng[,label]>\",\n \"Marker to draw; repeat for multiple markers\",\n collectOsmMarker,\n [],\n )\n .requiredOption(\"--output <path>\", \"Write PNG to a file\")\n .option(\"--json\", \"Print the raw maps response as JSON\")\n .action(\n withErrorHandler(async (options: OsmRenderOptions) => {\n const response = await callZeroMaps(\"osm/render\", {\n ...osmAreaPayload(options),\n width: options.width,\n height: options.height,\n style: options.style,\n title: options.title,\n markers: options.marker,\n });\n await writeOsmPng(options.output, response);\n if (options.json) {\n console.log(JSON.stringify(response));\n return;\n }\n renderOsmFileResponse(\"OSM render completed\", response, options.output);\n }),\n );\n\nconst osmCommand = new Command()\n .name(\"osm\")\n .description(\"Download and render OpenStreetMap data\")\n .addCommand(osmDownloadCommand)\n .addCommand(osmRenderCommand);\n\nconst placesCommand = new Command()\n .name(\"places\")\n .description(\"Search places and fetch place details\")\n .addCommand(placesSearchCommand)\n .addCommand(placesDetailsCommand);\n\nexport const zeroMapsCommand = new Command()\n .name(\"maps\")\n .description(\"Use managed zero maps services\")\n .addCommand(geocodeCommand)\n .addCommand(reverseGeocodeCommand)\n .addCommand(directionsCommand)\n .addCommand(placesCommand)\n .addCommand(osmCommand)\n .addHelpText(\n \"after\",\n `\nExamples:\n Geocode address: zero maps geocode --address \"1 Infinite Loop, Cupertino\" --json\n Get route: zero maps directions --origin \"SFO\" --destination \"Mountain View\" --mode driving --json\n Search places: zero maps places search --query \"coffee near Union Square SF\" --limit 5 --json\n Enterprise search: zero maps places search --query \"restaurants in SoMa\" --fields enterprise --json\n Place details: zero maps places details --place-id <id> --fields essentials --json\n Enterprise details: zero maps places details --place-id <id> --fields enterprise --json\n Download OSM data: zero maps osm download --bbox -122.43,37.76,-122.40,37.79 --output map.geojson\n Render OSM PNG: zero maps osm render --center 37.7749,-122.4194 --radius 1200 --output map.png\n\nNotes:\n - Authenticates via ZERO_TOKEN (requires maps:read capability) or a CLI token\n - Google Maps and OpenStreetMap calls and credit billing happen on the vm0 API server\n - Use --fields essentials for place details unless paid fields are required`,\n );\n"],"mappings":"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","names":[]}
|
|
@@ -5,23 +5,24 @@ import {
|
|
|
5
5
|
formatModelPolicyStatus,
|
|
6
6
|
formatModelProviderRoute,
|
|
7
7
|
getModelProviderRouteKind
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-HSGQT7LT.js";
|
|
9
9
|
import {
|
|
10
10
|
listZeroModelPolicies
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-ROB3OE37.js";
|
|
12
|
+
import "./chunk-N6TDQYGF.js";
|
|
13
|
+
import "./chunk-SB7EZ2ZO.js";
|
|
13
14
|
import {
|
|
14
15
|
getVm0ModelPriceTier,
|
|
15
16
|
source_default,
|
|
16
17
|
withErrorHandler
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-BQOOTJNB.js";
|
|
19
|
+
import "./chunk-A2NKQGRI.js";
|
|
19
20
|
import {
|
|
20
21
|
Command
|
|
21
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-LD4ZVU4O.js";
|
|
22
23
|
import {
|
|
23
24
|
init_esm_shims
|
|
24
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3VVCUQPB.js";
|
|
25
26
|
|
|
26
27
|
// src/commands/zero/model/index.ts
|
|
27
28
|
init_esm_shims();
|
|
@@ -88,4 +89,4 @@ export {
|
|
|
88
89
|
switchCommand,
|
|
89
90
|
zeroModelCommand
|
|
90
91
|
};
|
|
91
|
-
//# sourceMappingURL=model-
|
|
92
|
+
//# sourceMappingURL=model-I2MNQ5KC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/model/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getVm0ModelPriceTier } from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroModelPolicies } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n formatModelPolicyStatus,\n formatModelProviderRoute,\n getModelProviderRouteKind,\n} from \"../../../lib/domain/model-policy-display\";\n\nfunction formatPriceTier(tier: string | undefined): string {\n return tier ?? \"unknown\";\n}\n\nfunction getCurrentIntegration(): string | null {\n const prompt = process.env.VM0_APPEND_SYSTEM_PROMPT;\n if (!prompt) {\n return null;\n }\n\n const match = prompt.match(/You are currently running inside:\\s*([^\\n]+)/i);\n return match?.[1]?.trim().toLowerCase() ?? null;\n}\n\nexport function getModelSwitchGuidance(integration = getCurrentIntegration()) {\n const normalizedIntegration = integration?.toLowerCase();\n\n if (normalizedIntegration === \"web\") {\n return \"Switch models from the model selector next to the input box in the web chat.\";\n }\n\n if (normalizedIntegration === \"telegram\") {\n return \"Use /model in Telegram to switch models.\";\n }\n\n return \"Open https://app.vm0.ai and switch models from the model selector next to the input box.\";\n}\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List models allowed by the current organization\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroModelPolicies();\n\n if (result.policies.length === 0) {\n console.log(chalk.dim(\"No models are allowed for this organization\"));\n return;\n }\n\n console.log(chalk.bold(\"Allowed Models:\"));\n console.log();\n\n for (const policy of result.policies) {\n const defaultMarker = policy.isDefault ? chalk.dim(\" (default)\") : \"\";\n console.log(\n ` - ${policy.modelLabel} ${chalk.dim(`(${policy.model})`)}${defaultMarker}`,\n );\n console.log(` provider: ${formatModelProviderRoute(policy)}`);\n\n if (getModelProviderRouteKind(policy) === \"built-in\") {\n console.log(\n ` price tier: ${formatPriceTier(getVm0ModelPriceTier(policy.model))}`,\n );\n }\n\n const status = formatModelPolicyStatus(policy);\n if (status) {\n console.log(chalk.yellow(` status: ${status}`));\n }\n }\n\n console.log();\n console.log(\n chalk.dim(\n \"Use `zero model-provider set --help` to see how to switch each model between built-in and BYOK.\",\n ),\n );\n }),\n );\n\nexport const switchCommand = new Command()\n .name(\"switch\")\n .description(\"Show how to switch models in the current environment\")\n .action(() => {\n console.log(getModelSwitchGuidance());\n });\n\nexport const zeroModelCommand = new Command()\n .name(\"model\")\n .description(\"List available models and model-switching guidance\")\n .addCommand(listCommand)\n .addCommand(switchCommand);\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/model/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getVm0ModelPriceTier } from \"@vm0/api-contracts/contracts/model-providers\";\nimport { listZeroModelPolicies } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n formatModelPolicyStatus,\n formatModelProviderRoute,\n getModelProviderRouteKind,\n} from \"../../../lib/domain/model-policy-display\";\n\nfunction formatPriceTier(tier: string | undefined): string {\n return tier ?? \"unknown\";\n}\n\nfunction getCurrentIntegration(): string | null {\n const prompt = process.env.VM0_APPEND_SYSTEM_PROMPT;\n if (!prompt) {\n return null;\n }\n\n const match = prompt.match(/You are currently running inside:\\s*([^\\n]+)/i);\n return match?.[1]?.trim().toLowerCase() ?? null;\n}\n\nexport function getModelSwitchGuidance(integration = getCurrentIntegration()) {\n const normalizedIntegration = integration?.toLowerCase();\n\n if (normalizedIntegration === \"web\") {\n return \"Switch models from the model selector next to the input box in the web chat.\";\n }\n\n if (normalizedIntegration === \"telegram\") {\n return \"Use /model in Telegram to switch models.\";\n }\n\n return \"Open https://app.vm0.ai and switch models from the model selector next to the input box.\";\n}\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List models allowed by the current organization\")\n .action(\n withErrorHandler(async () => {\n const result = await listZeroModelPolicies();\n\n if (result.policies.length === 0) {\n console.log(chalk.dim(\"No models are allowed for this organization\"));\n return;\n }\n\n console.log(chalk.bold(\"Allowed Models:\"));\n console.log();\n\n for (const policy of result.policies) {\n const defaultMarker = policy.isDefault ? chalk.dim(\" (default)\") : \"\";\n console.log(\n ` - ${policy.modelLabel} ${chalk.dim(`(${policy.model})`)}${defaultMarker}`,\n );\n console.log(` provider: ${formatModelProviderRoute(policy)}`);\n\n if (getModelProviderRouteKind(policy) === \"built-in\") {\n console.log(\n ` price tier: ${formatPriceTier(getVm0ModelPriceTier(policy.model))}`,\n );\n }\n\n const status = formatModelPolicyStatus(policy);\n if (status) {\n console.log(chalk.yellow(` status: ${status}`));\n }\n }\n\n console.log();\n console.log(\n chalk.dim(\n \"Use `zero model-provider set --help` to see how to switch each model between built-in and BYOK.\",\n ),\n );\n }),\n );\n\nexport const switchCommand = new Command()\n .name(\"switch\")\n .description(\"Show how to switch models in the current environment\")\n .action(() => {\n console.log(getModelSwitchGuidance());\n });\n\nexport const zeroModelCommand = new Command()\n .name(\"model\")\n .description(\"List available models and model-switching guidance\")\n .addCommand(listCommand)\n .addCommand(switchCommand);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAWA,SAAS,gBAAgB,MAAkC;AACzD,SAAO,QAAQ;AACjB;AAEA,SAAS,wBAAuC;AAC9C,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,MAAM,+CAA+C;AAC1E,SAAO,QAAQ,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AAC7C;AAEO,SAAS,uBAAuB,cAAc,sBAAsB,GAAG;AAC5E,QAAM,wBAAwB,aAAa,YAAY;AAEvD,MAAI,0BAA0B,OAAO;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,0BAA0B,YAAY;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,cAAc,IAAI,QAAQ,EAC7B,KAAK,MAAM,EACX,MAAM,IAAI,EACV,YAAY,iDAAiD,EAC7D;AAAA,EACC,iBAAiB,YAAY;AAC3B,UAAM,SAAS,MAAM,sBAAsB;AAE3C,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,cAAQ,IAAI,eAAM,IAAI,6CAA6C,CAAC;AACpE;AAAA,IACF;AAEA,YAAQ,IAAI,eAAM,KAAK,iBAAiB,CAAC;AACzC,YAAQ,IAAI;AAEZ,eAAW,UAAU,OAAO,UAAU;AACpC,YAAM,gBAAgB,OAAO,YAAY,eAAM,IAAI,YAAY,IAAI;AACnE,cAAQ;AAAA,QACN,OAAO,OAAO,UAAU,IAAI,eAAM,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,GAAG,aAAa;AAAA,MAC5E;AACA,cAAQ,IAAI,iBAAiB,yBAAyB,MAAM,CAAC,EAAE;AAE/D,UAAI,0BAA0B,MAAM,MAAM,YAAY;AACpD,gBAAQ;AAAA,UACN,mBAAmB,gBAAgB,qBAAqB,OAAO,KAAK,CAAC,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,YAAM,SAAS,wBAAwB,MAAM;AAC7C,UAAI,QAAQ;AACV,gBAAQ,IAAI,eAAM,OAAO,eAAe,MAAM,EAAE,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,eAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEK,IAAM,gBAAgB,IAAI,QAAQ,EACtC,KAAK,QAAQ,EACb,YAAY,sDAAsD,EAClE,OAAO,MAAM;AACZ,UAAQ,IAAI,uBAAuB,CAAC;AACtC,CAAC;AAEI,IAAM,mBAAmB,IAAI,QAAQ,EACzC,KAAK,OAAO,EACZ,YAAY,oDAAoD,EAChE,WAAW,WAAW,EACtB,WAAW,aAAa;","names":[]}
|
|
@@ -5,22 +5,23 @@ import {
|
|
|
5
5
|
formatModelPolicyStatus,
|
|
6
6
|
getModelProviderRouteKind,
|
|
7
7
|
getModelProviderTypeLabel
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-HSGQT7LT.js";
|
|
9
9
|
import {
|
|
10
10
|
listZeroModelPolicies
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-ROB3OE37.js";
|
|
12
|
+
import "./chunk-N6TDQYGF.js";
|
|
13
|
+
import "./chunk-SB7EZ2ZO.js";
|
|
13
14
|
import {
|
|
14
15
|
source_default,
|
|
15
16
|
withErrorHandler
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-BQOOTJNB.js";
|
|
18
|
+
import "./chunk-A2NKQGRI.js";
|
|
18
19
|
import {
|
|
19
20
|
Command
|
|
20
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-LD4ZVU4O.js";
|
|
21
22
|
import {
|
|
22
23
|
init_esm_shims
|
|
23
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-3VVCUQPB.js";
|
|
24
25
|
|
|
25
26
|
// src/commands/zero/model-provider/index.ts
|
|
26
27
|
init_esm_shims();
|
|
@@ -72,4 +73,4 @@ export {
|
|
|
72
73
|
setCommand,
|
|
73
74
|
zeroModelProviderCommand
|
|
74
75
|
};
|
|
75
|
-
//# sourceMappingURL=model-provider-
|
|
76
|
+
//# sourceMappingURL=model-provider-AOCCHEMP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/zero/model-provider/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroModelPolicies } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n formatModelPolicyStatus,\n getModelProviderRouteKind,\n getModelProviderTypeLabel,\n} from \"../../../lib/domain/model-policy-display\";\n\nexport const MODEL_PROVIDER_SET_GUIDANCE = [\n \"Model provider routing is configured in the web app.\",\n \"\",\n \"Organization admins: open https://app.vm0.ai, use the top-left organization menu, choose Manage, then add, delete, or adjust model providers.\",\n \"\",\n \"If an organization admin sets a model provider to subscription, members must use the bottom-left user menu, choose Preferences / Personal Models, and connect their personal subscription.\",\n].join(\"\\n\");\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\n \"List provider routing for each model allowed by the organization\",\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroModelPolicies();\n\n if (result.policies.length === 0) {\n console.log(\n chalk.dim(\n \"No model provider routes are allowed for this organization\",\n ),\n );\n return;\n }\n\n console.log(chalk.bold(\"Model Provider Routes:\"));\n console.log();\n\n for (const policy of result.policies) {\n const defaultMarker = policy.isDefault ? chalk.dim(\" (default)\") : \"\";\n console.log(\n ` - ${policy.modelLabel} ${chalk.dim(`(${policy.model})`)}${defaultMarker}`,\n );\n console.log(` provider: ${getModelProviderRouteKind(policy)}`);\n console.log(\n ` provider type: ${policy.defaultProviderType} (${getModelProviderTypeLabel(policy.defaultProviderType)})`,\n );\n\n const status = formatModelPolicyStatus(policy);\n if (status) {\n console.log(chalk.yellow(` status: ${status}`));\n }\n }\n }),\n );\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Show where to adjust model provider routing\")\n .addHelpText(\"after\", `\\n${MODEL_PROVIDER_SET_GUIDANCE}`)\n .action(() => {\n console.log(MODEL_PROVIDER_SET_GUIDANCE);\n });\n\nexport const zeroModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Inspect model provider routing\")\n .addCommand(listCommand)\n .addCommand(setCommand);\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/commands/zero/model-provider/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listZeroModelPolicies } from \"../../../lib/api\";\nimport { withErrorHandler } from \"../../../lib/command\";\nimport {\n formatModelPolicyStatus,\n getModelProviderRouteKind,\n getModelProviderTypeLabel,\n} from \"../../../lib/domain/model-policy-display\";\n\nexport const MODEL_PROVIDER_SET_GUIDANCE = [\n \"Model provider routing is configured in the web app.\",\n \"\",\n \"Organization admins: open https://app.vm0.ai, use the top-left organization menu, choose Manage, then add, delete, or adjust model providers.\",\n \"\",\n \"If an organization admin sets a model provider to subscription, members must use the bottom-left user menu, choose Preferences / Personal Models, and connect their personal subscription.\",\n].join(\"\\n\");\n\nconst listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\n \"List provider routing for each model allowed by the organization\",\n )\n .action(\n withErrorHandler(async () => {\n const result = await listZeroModelPolicies();\n\n if (result.policies.length === 0) {\n console.log(\n chalk.dim(\n \"No model provider routes are allowed for this organization\",\n ),\n );\n return;\n }\n\n console.log(chalk.bold(\"Model Provider Routes:\"));\n console.log();\n\n for (const policy of result.policies) {\n const defaultMarker = policy.isDefault ? chalk.dim(\" (default)\") : \"\";\n console.log(\n ` - ${policy.modelLabel} ${chalk.dim(`(${policy.model})`)}${defaultMarker}`,\n );\n console.log(` provider: ${getModelProviderRouteKind(policy)}`);\n console.log(\n ` provider type: ${policy.defaultProviderType} (${getModelProviderTypeLabel(policy.defaultProviderType)})`,\n );\n\n const status = formatModelPolicyStatus(policy);\n if (status) {\n console.log(chalk.yellow(` status: ${status}`));\n }\n }\n }),\n );\n\nexport const setCommand = new Command()\n .name(\"set\")\n .description(\"Show where to adjust model provider routing\")\n .addHelpText(\"after\", `\\n${MODEL_PROVIDER_SET_GUIDANCE}`)\n .action(() => {\n console.log(MODEL_PROVIDER_SET_GUIDANCE);\n });\n\nexport const zeroModelProviderCommand = new Command()\n .name(\"model-provider\")\n .description(\"Inspect model provider routing\")\n .addCommand(listCommand)\n .addCommand(setCommand);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAUO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,cAAc,IAAI,QAAQ,EAC7B,KAAK,MAAM,EACX,MAAM,IAAI,EACV;AAAA,EACC;AACF,EACC;AAAA,EACC,iBAAiB,YAAY;AAC3B,UAAM,SAAS,MAAM,sBAAsB;AAE3C,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,cAAQ;AAAA,QACN,eAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,eAAM,KAAK,wBAAwB,CAAC;AAChD,YAAQ,IAAI;AAEZ,eAAW,UAAU,OAAO,UAAU;AACpC,YAAM,gBAAgB,OAAO,YAAY,eAAM,IAAI,YAAY,IAAI;AACnE,cAAQ;AAAA,QACN,OAAO,OAAO,UAAU,IAAI,eAAM,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,GAAG,aAAa;AAAA,MAC5E;AACA,cAAQ,IAAI,iBAAiB,0BAA0B,MAAM,CAAC,EAAE;AAChE,cAAQ;AAAA,QACN,sBAAsB,OAAO,mBAAmB,KAAK,0BAA0B,OAAO,mBAAmB,CAAC;AAAA,MAC5G;AAEA,YAAM,SAAS,wBAAwB,MAAM;AAC7C,UAAI,QAAQ;AACV,gBAAQ,IAAI,eAAM,OAAO,eAAe,MAAM,EAAE,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEK,IAAM,aAAa,IAAI,QAAQ,EACnC,KAAK,KAAK,EACV,YAAY,6CAA6C,EACzD,YAAY,SAAS;AAAA,EAAK,2BAA2B,EAAE,EACvD,OAAO,MAAM;AACZ,UAAQ,IAAI,2BAA2B;AACzC,CAAC;AAEI,IAAM,2BAA2B,IAAI,QAAQ,EACjD,KAAK,gBAAgB,EACrB,YAAY,gCAAgC,EAC5C,WAAW,WAAW,EACtB,WAAW,UAAU;","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
promptConfirm,
|
|
7
7
|
promptPassword,
|
|
8
8
|
require_prompts
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-X2545RBX.js";
|
|
10
10
|
import {
|
|
11
11
|
deleteZeroOrg,
|
|
12
12
|
deleteZeroOrgModelProvider,
|
|
@@ -25,8 +25,9 @@ import {
|
|
|
25
25
|
setZeroOrgVariable,
|
|
26
26
|
updateZeroOrg,
|
|
27
27
|
upsertZeroOrgModelProvider
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import "./chunk-
|
|
28
|
+
} from "./chunk-ROB3OE37.js";
|
|
29
|
+
import "./chunk-N6TDQYGF.js";
|
|
30
|
+
import "./chunk-SB7EZ2ZO.js";
|
|
30
31
|
import {
|
|
31
32
|
ApiRequestError,
|
|
32
33
|
MODEL_PROVIDER_TYPES,
|
|
@@ -38,15 +39,15 @@ import {
|
|
|
38
39
|
hasAuthMethods,
|
|
39
40
|
source_default,
|
|
40
41
|
withErrorHandler
|
|
41
|
-
} from "./chunk-
|
|
42
|
-
import "./chunk-
|
|
42
|
+
} from "./chunk-BQOOTJNB.js";
|
|
43
|
+
import "./chunk-A2NKQGRI.js";
|
|
43
44
|
import {
|
|
44
45
|
Command
|
|
45
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-LD4ZVU4O.js";
|
|
46
47
|
import {
|
|
47
48
|
__toESM,
|
|
48
49
|
init_esm_shims
|
|
49
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-3VVCUQPB.js";
|
|
50
51
|
|
|
51
52
|
// src/commands/zero/org/index.ts
|
|
52
53
|
init_esm_shims();
|
|
@@ -878,4 +879,4 @@ var zeroOrgCommand = new Command().name("org").description("Manage organization
|
|
|
878
879
|
export {
|
|
879
880
|
zeroOrgCommand
|
|
880
881
|
};
|
|
881
|
-
//# sourceMappingURL=org-
|
|
882
|
+
//# sourceMappingURL=org-MVBG3WXZ.js.map
|