@sangria-sdk/cli 0.1.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 (58) hide show
  1. package/README.md +49 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +79 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +74 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/balance.d.ts +3 -0
  11. package/dist/commands/balance.d.ts.map +1 -0
  12. package/dist/commands/balance.js +13 -0
  13. package/dist/commands/balance.js.map +1 -0
  14. package/dist/commands/buy.d.ts +3 -0
  15. package/dist/commands/buy.d.ts.map +1 -0
  16. package/dist/commands/buy.js +17 -0
  17. package/dist/commands/buy.js.map +1 -0
  18. package/dist/commands/discover.d.ts +6 -0
  19. package/dist/commands/discover.d.ts.map +1 -0
  20. package/dist/commands/discover.js +31 -0
  21. package/dist/commands/discover.js.map +1 -0
  22. package/dist/commands/types.d.ts +7 -0
  23. package/dist/commands/types.d.ts.map +1 -0
  24. package/dist/commands/types.js +2 -0
  25. package/dist/commands/types.js.map +1 -0
  26. package/dist/lib/args.d.ts +8 -0
  27. package/dist/lib/args.d.ts.map +1 -0
  28. package/dist/lib/args.js +39 -0
  29. package/dist/lib/args.js.map +1 -0
  30. package/dist/lib/client.d.ts +14 -0
  31. package/dist/lib/client.d.ts.map +1 -0
  32. package/dist/lib/client.js +101 -0
  33. package/dist/lib/client.js.map +1 -0
  34. package/dist/lib/config.d.ts +21 -0
  35. package/dist/lib/config.d.ts.map +1 -0
  36. package/dist/lib/config.js +62 -0
  37. package/dist/lib/config.js.map +1 -0
  38. package/dist/lib/errors.d.ts +23 -0
  39. package/dist/lib/errors.d.ts.map +1 -0
  40. package/dist/lib/errors.js +45 -0
  41. package/dist/lib/errors.js.map +1 -0
  42. package/dist/lib/help.d.ts +2 -0
  43. package/dist/lib/help.d.ts.map +1 -0
  44. package/dist/lib/help.js +23 -0
  45. package/dist/lib/help.js.map +1 -0
  46. package/dist/lib/money.d.ts +11 -0
  47. package/dist/lib/money.d.ts.map +1 -0
  48. package/dist/lib/money.js +19 -0
  49. package/dist/lib/money.js.map +1 -0
  50. package/dist/lib/output.d.ts +10 -0
  51. package/dist/lib/output.d.ts.map +1 -0
  52. package/dist/lib/output.js +55 -0
  53. package/dist/lib/output.js.map +1 -0
  54. package/dist/types/api.d.ts +42 -0
  55. package/dist/types/api.d.ts.map +1 -0
  56. package/dist/types/api.js +2 -0
  57. package/dist/types/api.js.map +1 -0
  58. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # @sangria-sdk/cli
2
+
3
+ Small CLI for Sangria agent flows.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @sangria-sdk/cli
9
+ ```
10
+
11
+ ## Auth
12
+
13
+ Use an environment variable:
14
+
15
+ ```bash
16
+ export SANGRIA_API_KEY="sg_agents_..."
17
+ sangria auth status
18
+ ```
19
+
20
+ Or store a key locally:
21
+
22
+ ```bash
23
+ sangria auth set sg_agents_...
24
+ sangria auth status
25
+ ```
26
+
27
+ `SANGRIA_API_KEY` takes precedence over stored config.
28
+
29
+ ## Commands
30
+
31
+ ```bash
32
+ sangria balance
33
+ sangria discover "Nespresso decaf espresso pods under $50" --reasoning "User prefers decaf pods."
34
+ sangria buy <discovery_id> <sku>
35
+ ```
36
+
37
+ Add `--json` for machine-readable output:
38
+
39
+ ```bash
40
+ sangria discover "16oz iced oat-milk latte, decaf" \
41
+ --reasoning "User asked for a decaf oat latte near the office." \
42
+ --json
43
+ ```
44
+
45
+ Optional environment:
46
+
47
+ ```bash
48
+ SANGRIA_URL=https://api.getsangria.com
49
+ ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs, boolFlag, stringFlag } from "./lib/args.js";
3
+ import { runAuthCommand } from "./commands/auth.js";
4
+ import { runBalanceCommand } from "./commands/balance.js";
5
+ import { runBuyCommand } from "./commands/buy.js";
6
+ import { runDiscoverCommand } from "./commands/discover.js";
7
+ import { resolveConfig } from "./lib/config.js";
8
+ import { CliError, EXIT } from "./lib/errors.js";
9
+ import { helpText } from "./lib/help.js";
10
+ async function main(argv) {
11
+ const parsed = parseArgs(argv);
12
+ const json = boolFlag(parsed.flags, "json");
13
+ const verbose = boolFlag(parsed.flags, "verbose");
14
+ if (boolFlag(parsed.flags, "help") || parsed.command.length === 0) {
15
+ process.stdout.write(helpText());
16
+ return EXIT.success;
17
+ }
18
+ const config = await resolveConfig({
19
+ apiKey: stringFlag(parsed.flags, "api-key"),
20
+ baseUrl: stringFlag(parsed.flags, "base-url"),
21
+ });
22
+ if (verbose) {
23
+ process.stderr.write(`Base URL: ${config.baseUrl} (${config.baseUrlSource})\n`);
24
+ process.stderr.write(`API key: ${config.apiKey ? `set (${config.apiKeySource})` : "missing"}\n`);
25
+ }
26
+ const ctx = { config, json, verbose };
27
+ const [group, subcommand, ...args] = parsed.command;
28
+ if (group === "auth") {
29
+ return runAuthCommand(subcommand, args, ctx);
30
+ }
31
+ if (group === "balance") {
32
+ return runBalanceCommand(ctx);
33
+ }
34
+ if (group === "discover") {
35
+ return runDiscoverCommand(subcommand, {
36
+ reasoning: stringFlag(parsed.flags, "reasoning"),
37
+ context: stringFlag(parsed.flags, "context"),
38
+ }, ctx);
39
+ }
40
+ if (group === "buy") {
41
+ return runBuyCommand(subcommand, args[0], ctx);
42
+ }
43
+ throw new CliError(`Unknown command: ${parsed.command.join(" ")}`, EXIT.usage);
44
+ }
45
+ const argv = process.argv.slice(2);
46
+ const wantsJson = argv.includes("--json");
47
+ main(argv)
48
+ .then((code) => {
49
+ process.exitCode = code;
50
+ })
51
+ .catch((error) => {
52
+ if (error instanceof CliError) {
53
+ if (wantsJson) {
54
+ process.stderr.write(`${JSON.stringify({
55
+ error: error.message,
56
+ exit_code: error.exitCode,
57
+ ...(error.details ? { details: error.details } : {}),
58
+ }, null, 2)}\n`);
59
+ }
60
+ else {
61
+ process.stderr.write(`${error.message}\n`);
62
+ if (error.details)
63
+ process.stderr.write(`${JSON.stringify(error.details)}\n`);
64
+ }
65
+ process.exitCode = error.exitCode;
66
+ return;
67
+ }
68
+ if (wantsJson) {
69
+ process.stderr.write(`${JSON.stringify({
70
+ error: error instanceof Error ? error.message : String(error),
71
+ exit_code: EXIT.generic,
72
+ }, null, 2)}\n`);
73
+ }
74
+ else {
75
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
76
+ }
77
+ process.exitCode = EXIT.generic;
78
+ });
79
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandContext } from "./types.js";
2
+ export declare function runAuthCommand(subcommand: string | undefined, args: string[], ctx: CommandContext): Promise<number>;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzH"}
@@ -0,0 +1,74 @@
1
+ import { SangriaAgentClient } from "../lib/client.js";
2
+ import { clearStoredConfig, readStoredConfig, writeStoredConfig } from "../lib/config.js";
3
+ import { CliError, EXIT } from "../lib/errors.js";
4
+ import { printJson } from "../lib/output.js";
5
+ export async function runAuthCommand(subcommand, args, ctx) {
6
+ switch (subcommand) {
7
+ case "set":
8
+ return setAuth(args, ctx);
9
+ case "unset":
10
+ return unsetAuth(ctx);
11
+ case "status":
12
+ return authStatus(ctx);
13
+ default:
14
+ throw new CliError("Usage: sangria auth status|set|unset", EXIT.usage);
15
+ }
16
+ }
17
+ async function setAuth(args, ctx) {
18
+ const apiKey = args[0];
19
+ if (!apiKey)
20
+ throw new CliError("Missing api_key.", EXIT.usage);
21
+ const stored = await readStoredConfig();
22
+ await writeStoredConfig({ ...stored, apiKey });
23
+ if (ctx.json)
24
+ printJson({ saved: true, config_path: ctx.config.configPath });
25
+ else
26
+ process.stdout.write(`Saved Sangria API key to ${ctx.config.configPath}\n`);
27
+ return EXIT.success;
28
+ }
29
+ async function unsetAuth(ctx) {
30
+ await clearStoredConfig();
31
+ if (ctx.json)
32
+ printJson({ cleared: true, config_path: ctx.config.configPath });
33
+ else
34
+ process.stdout.write(`Cleared Sangria config at ${ctx.config.configPath}\n`);
35
+ return EXIT.success;
36
+ }
37
+ async function authStatus(ctx) {
38
+ if (!ctx.config.apiKey) {
39
+ const status = {
40
+ api_key_set: false,
41
+ authenticated: false,
42
+ base_url: ctx.config.baseUrl,
43
+ config_path: ctx.config.configPath,
44
+ };
45
+ if (ctx.json)
46
+ printJson(status);
47
+ else {
48
+ process.stdout.write("API key: missing\n");
49
+ process.stdout.write("Auth: not configured\n");
50
+ process.stdout.write("Run: sangria auth set sg_agents_...\n");
51
+ }
52
+ return EXIT.auth;
53
+ }
54
+ const client = new SangriaAgentClient(ctx.config);
55
+ const balance = await client.balance();
56
+ const status = {
57
+ api_key_set: true,
58
+ api_key_source: ctx.config.apiKeySource,
59
+ authenticated: true,
60
+ base_url: ctx.config.baseUrl,
61
+ balance_microunits: balance.balance_microunits,
62
+ balance_usd: (balance.balance_microunits / 1_000_000).toFixed(2),
63
+ };
64
+ if (ctx.json)
65
+ printJson(status);
66
+ else {
67
+ process.stdout.write(`API key: set (${ctx.config.apiKeySource})\n`);
68
+ process.stdout.write("Auth: valid\n");
69
+ process.stdout.write(`Balance: $${status.balance_usd}\n`);
70
+ process.stdout.write(`API: ${ctx.config.baseUrl}\n`);
71
+ }
72
+ return EXIT.success;
73
+ }
74
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandContext } from "./types.js";
2
+ export declare function runBalanceCommand(ctx: CommandContext): Promise<number>;
3
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5E"}
@@ -0,0 +1,13 @@
1
+ import { SangriaAgentClient } from "../lib/client.js";
2
+ import { EXIT } from "../lib/errors.js";
3
+ import { addDisplayFieldsToBalance, printBalance, printJson } from "../lib/output.js";
4
+ export async function runBalanceCommand(ctx) {
5
+ const client = new SangriaAgentClient(ctx.config);
6
+ const balance = await client.balance();
7
+ if (ctx.json)
8
+ printJson(addDisplayFieldsToBalance(balance));
9
+ else
10
+ printBalance(balance);
11
+ return EXIT.success;
12
+ }
13
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/commands/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGtF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAmB;IACzD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvC,IAAI,GAAG,CAAC,IAAI;QAAE,SAAS,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;;QACvD,YAAY,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandContext } from "./types.js";
2
+ export declare function runBuyCommand(discoveryId: string | undefined, sku: string | undefined, ctx: CommandContext): Promise<number>;
3
+ //# sourceMappingURL=buy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,17 @@
1
+ import { SangriaAgentClient } from "../lib/client.js";
2
+ import { CliError, EXIT } from "../lib/errors.js";
3
+ import { printBuy, printJson } from "../lib/output.js";
4
+ export async function runBuyCommand(discoveryId, sku, ctx) {
5
+ if (!discoveryId)
6
+ throw new CliError("Missing discovery_id.", EXIT.usage);
7
+ if (!sku)
8
+ throw new CliError("Missing sku.", EXIT.usage);
9
+ const client = new SangriaAgentClient(ctx.config);
10
+ const result = await client.buy(discoveryId, sku);
11
+ if (ctx.json)
12
+ printJson(result);
13
+ else
14
+ printBuy(result);
15
+ return result.status === "failed" ? EXIT.orderFailed : EXIT.success;
16
+ }
17
+ //# sourceMappingURL=buy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buy.js","sourceRoot":"","sources":["../../src/commands/buy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAA+B,EAC/B,GAAuB,EACvB,GAAmB;IAEnB,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAElD,IAAI,GAAG,CAAC,IAAI;QAAE,SAAS,CAAC,MAAM,CAAC,CAAC;;QAC3B,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AACtE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CommandContext } from "./types.js";
2
+ export declare function runDiscoverCommand(intent: string | undefined, options: {
3
+ reasoning?: string;
4
+ context?: string;
5
+ }, ctx: CommandContext): Promise<number>;
6
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACjD,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,31 @@
1
+ import { SangriaAgentClient } from "../lib/client.js";
2
+ import { CliError, EXIT } from "../lib/errors.js";
3
+ import { addDisplayFieldsToDiscover, printDiscover, printJson } from "../lib/output.js";
4
+ export async function runDiscoverCommand(intent, options, ctx) {
5
+ if (!intent)
6
+ throw new CliError("Missing intent.", EXIT.usage);
7
+ if (!options.reasoning)
8
+ throw new CliError("Missing --reasoning <text>.", EXIT.usage);
9
+ const context = options.context === undefined ? undefined : parseContext(options.context);
10
+ const client = new SangriaAgentClient(ctx.config);
11
+ const result = await client.discover({
12
+ intent,
13
+ reasoning: options.reasoning,
14
+ ...(context === undefined ? {} : { context }),
15
+ });
16
+ const displayResult = addDisplayFieldsToDiscover(result);
17
+ if (ctx.json)
18
+ printJson(displayResult);
19
+ else
20
+ printDiscover(displayResult);
21
+ return EXIT.success;
22
+ }
23
+ function parseContext(input) {
24
+ try {
25
+ return JSON.parse(input);
26
+ }
27
+ catch {
28
+ throw new CliError("--context must be valid JSON.", EXIT.usage);
29
+ }
30
+ }
31
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGxF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA0B,EAC1B,OAAiD,EACjD,GAAmB;IAEnB,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;QACnC,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,IAAI;QAAE,SAAS,CAAC,aAAa,CAAC,CAAC;;QAClC,aAAa,CAAC,aAAa,CAAC,CAAC;IAElC,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,+BAA+B,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RuntimeConfig } from "../lib/config.js";
2
+ export interface CommandContext {
3
+ config: RuntimeConfig;
4
+ json: boolean;
5
+ verbose: boolean;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface ParsedArgs {
2
+ command: string[];
3
+ flags: Record<string, string | boolean>;
4
+ }
5
+ export declare function parseArgs(argv: string[]): ParsedArgs;
6
+ export declare function stringFlag(flags: Record<string, string | boolean>, name: string): string | undefined;
7
+ export declare function boolFlag(flags: Record<string, string | boolean>, name: string): boolean;
8
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAKD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8BpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGpG;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvF"}
@@ -0,0 +1,39 @@
1
+ import { CliError, EXIT } from "./errors.js";
2
+ const valueFlags = new Set(["api-key", "base-url", "reasoning", "context"]);
3
+ const booleanFlags = new Set(["json", "help", "verbose", "no-color"]);
4
+ export function parseArgs(argv) {
5
+ const command = [];
6
+ const flags = {};
7
+ for (let i = 0; i < argv.length; i += 1) {
8
+ const arg = argv[i];
9
+ if (!arg.startsWith("--")) {
10
+ command.push(arg);
11
+ continue;
12
+ }
13
+ const raw = arg.slice(2);
14
+ const equalsIndex = raw.indexOf("=");
15
+ const name = equalsIndex === -1 ? raw : raw.slice(0, equalsIndex);
16
+ const inlineValue = equalsIndex === -1 ? undefined : raw.slice(equalsIndex + 1);
17
+ if (booleanFlags.has(name)) {
18
+ flags[name] = true;
19
+ continue;
20
+ }
21
+ if (!valueFlags.has(name)) {
22
+ throw new CliError(`Unknown flag --${name}`, EXIT.usage);
23
+ }
24
+ const value = inlineValue ?? argv[++i];
25
+ if (!value || value.startsWith("--")) {
26
+ throw new CliError(`Missing value for --${name}`, EXIT.usage);
27
+ }
28
+ flags[name] = value;
29
+ }
30
+ return { command, flags };
31
+ }
32
+ export function stringFlag(flags, name) {
33
+ const value = flags[name];
34
+ return typeof value === "string" ? value : undefined;
35
+ }
36
+ export function boolFlag(flags, name) {
37
+ return flags[name] === true;
38
+ }
39
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAO7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtE,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAqC,EAAE,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC,kBAAkB,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAAC,uBAAuB,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAuC,EAAE,IAAY;IAC9E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAuC,EAAE,IAAY;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { BalanceResponse, BuyResponse, DiscoverRequest, DiscoverResponse } from "../types/api.js";
2
+ export declare class SangriaAgentClient {
3
+ private readonly apiKey;
4
+ private readonly baseUrl;
5
+ constructor(config: {
6
+ apiKey?: string;
7
+ baseUrl: string;
8
+ });
9
+ balance(): Promise<BalanceResponse>;
10
+ discover(body: DiscoverRequest): Promise<DiscoverResponse>;
11
+ buy(discoveryId: string, sku: string): Promise<BuyResponse>;
12
+ private request;
13
+ }
14
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAiB,MAAM,iBAAiB,CAAC;AAEtH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI1D,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAOnD,OAAO;CAqCtB"}
@@ -0,0 +1,101 @@
1
+ import { ApiError, CliError, EXIT } from "./errors.js";
2
+ export class SangriaAgentClient {
3
+ apiKey;
4
+ baseUrl;
5
+ constructor(config) {
6
+ if (!config.apiKey) {
7
+ throw new CliError("SANGRIA_API_KEY is not set. Run `sangria auth set <key>` or export SANGRIA_API_KEY.", EXIT.auth);
8
+ }
9
+ this.apiKey = config.apiKey;
10
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
11
+ }
12
+ async balance() {
13
+ return this.request("GET", "/v1/balance");
14
+ }
15
+ async discover(body) {
16
+ return this.request("POST", "/v1/discover", body);
17
+ }
18
+ async buy(discoveryId, sku) {
19
+ return this.request("POST", "/v1/buy", {
20
+ discovery_id: discoveryId,
21
+ sku,
22
+ });
23
+ }
24
+ async request(method, path, body) {
25
+ const controller = new AbortController();
26
+ const timeout = setTimeout(() => controller.abort(), 30_000);
27
+ try {
28
+ const response = await fetch(`${this.baseUrl}${path}`, {
29
+ method,
30
+ signal: controller.signal,
31
+ headers: {
32
+ Authorization: `Bearer ${this.apiKey}`,
33
+ ...(body === undefined ? {} : { "Content-Type": "application/json" }),
34
+ },
35
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
36
+ });
37
+ const json = await readJson(response);
38
+ if (!response.ok) {
39
+ const error = (json ?? {});
40
+ const code = error.error || `http_${response.status}`;
41
+ throw new ApiError(response.status, code, friendlyApiMessage(code, error.missing_field), {
42
+ error: code,
43
+ status: response.status,
44
+ missing_field: error.missing_field,
45
+ });
46
+ }
47
+ return json;
48
+ }
49
+ catch (error) {
50
+ if (error instanceof ApiError || error instanceof CliError)
51
+ throw error;
52
+ if (error instanceof Error && error.name === "AbortError") {
53
+ throw new CliError("Sangria API request timed out.", EXIT.unavailable);
54
+ }
55
+ throw new CliError("Could not reach Sangria API.", EXIT.unavailable, {
56
+ cause: error instanceof Error ? error.message : String(error),
57
+ });
58
+ }
59
+ finally {
60
+ clearTimeout(timeout);
61
+ }
62
+ }
63
+ }
64
+ async function readJson(response) {
65
+ const text = await response.text();
66
+ if (!text)
67
+ return {};
68
+ try {
69
+ return JSON.parse(text);
70
+ }
71
+ catch {
72
+ throw new CliError(`Sangria API returned non-JSON response (${response.status}).`, EXIT.unavailable);
73
+ }
74
+ }
75
+ function friendlyApiMessage(code, missingField) {
76
+ switch (code) {
77
+ case "invalid_request":
78
+ return missingField ? `Your Sangria profile is missing ${missingField}.` : "The request is invalid.";
79
+ case "invalid_json":
80
+ return "The request JSON is invalid.";
81
+ case "invalid_intent":
82
+ return "Intent is required and must be 200 characters or fewer.";
83
+ case "invalid_reasoning":
84
+ return "Reasoning is required and must be 1,000 characters or fewer.";
85
+ case "invalid_discovery_id":
86
+ return "Discovery ID is invalid or was not found.";
87
+ case "invalid_sku":
88
+ return "SKU is invalid for this discovery.";
89
+ case "discovery_expired":
90
+ return "Discovery quote expired. Run discover again.";
91
+ case "insufficient_funds":
92
+ return "Insufficient Sangria balance.";
93
+ case "merchant_unreachable":
94
+ return "Merchant is currently unreachable.";
95
+ case "embedding_unavailable":
96
+ return "Discovery is temporarily unavailable.";
97
+ default:
98
+ return code;
99
+ }
100
+ }
101
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare const DEFAULT_BASE_URL = "https://api.getsangria.com";
2
+ export interface StoredConfig {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ }
6
+ export interface RuntimeConfig {
7
+ apiKey?: string;
8
+ apiKeySource?: "flag" | "env" | "config";
9
+ baseUrl: string;
10
+ baseUrlSource: "flag" | "env" | "config" | "default";
11
+ configPath: string;
12
+ }
13
+ export declare function configPath(): string;
14
+ export declare function readStoredConfig(): Promise<StoredConfig>;
15
+ export declare function writeStoredConfig(config: StoredConfig): Promise<void>;
16
+ export declare function clearStoredConfig(): Promise<void>;
17
+ export declare function resolveConfig(flags: {
18
+ apiKey?: string;
19
+ baseUrl?: string;
20
+ }): Promise<RuntimeConfig>;
21
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAS9D;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BzB"}
@@ -0,0 +1,62 @@
1
+ import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ export const DEFAULT_BASE_URL = "https://api.getsangria.com";
5
+ export function configPath() {
6
+ const base = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
7
+ return join(base, "sangria", "config.json");
8
+ }
9
+ export async function readStoredConfig() {
10
+ try {
11
+ return JSON.parse(await readFile(configPath(), "utf8"));
12
+ }
13
+ catch (error) {
14
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
15
+ return {};
16
+ }
17
+ throw error;
18
+ }
19
+ }
20
+ export async function writeStoredConfig(config) {
21
+ const path = configPath();
22
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
23
+ await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
24
+ }
25
+ export async function clearStoredConfig() {
26
+ try {
27
+ await unlink(configPath());
28
+ }
29
+ catch (error) {
30
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
31
+ return;
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+ export async function resolveConfig(flags) {
37
+ const stored = await readStoredConfig();
38
+ const apiKey = flags.apiKey || process.env.SANGRIA_API_KEY || stored.apiKey;
39
+ const apiKeySource = flags.apiKey
40
+ ? "flag"
41
+ : process.env.SANGRIA_API_KEY
42
+ ? "env"
43
+ : stored.apiKey
44
+ ? "config"
45
+ : undefined;
46
+ const baseUrl = (flags.baseUrl || process.env.SANGRIA_URL || stored.baseUrl || DEFAULT_BASE_URL).replace(/\/+$/, "");
47
+ const baseUrlSource = flags.baseUrl
48
+ ? "flag"
49
+ : process.env.SANGRIA_URL
50
+ ? "env"
51
+ : stored.baseUrl
52
+ ? "config"
53
+ : "default";
54
+ return {
55
+ apiKey,
56
+ apiKeySource,
57
+ baseUrl,
58
+ baseUrlSource,
59
+ configPath: configPath(),
60
+ };
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare const EXIT: {
2
+ readonly success: 0;
3
+ readonly generic: 1;
4
+ readonly usage: 2;
5
+ readonly auth: 3;
6
+ readonly validation: 4;
7
+ readonly insufficientFunds: 5;
8
+ readonly discoveryExpired: 6;
9
+ readonly orderFailed: 7;
10
+ readonly unavailable: 8;
11
+ };
12
+ export declare class CliError extends Error {
13
+ readonly exitCode: number;
14
+ readonly details?: Record<string, unknown>;
15
+ constructor(message: string, exitCode?: number, details?: Record<string, unknown>);
16
+ }
17
+ export declare class ApiError extends CliError {
18
+ readonly statusCode: number;
19
+ readonly errorCode: string;
20
+ constructor(statusCode: number, errorCode: string, message?: string, details?: Record<string, unknown>);
21
+ }
22
+ export declare function exitCodeForApiError(statusCode: number, errorCode: string): number;
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI;;;;;;;;;;CAUP,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/B,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAqB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMhG;AAED,qBAAa,QAAS,SAAQ,QAAQ;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMvG;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAOjF"}
@@ -0,0 +1,45 @@
1
+ export const EXIT = {
2
+ success: 0,
3
+ generic: 1,
4
+ usage: 2,
5
+ auth: 3,
6
+ validation: 4,
7
+ insufficientFunds: 5,
8
+ discoveryExpired: 6,
9
+ orderFailed: 7,
10
+ unavailable: 8,
11
+ };
12
+ export class CliError extends Error {
13
+ exitCode;
14
+ details;
15
+ constructor(message, exitCode = EXIT.generic, details) {
16
+ super(message);
17
+ this.name = "CliError";
18
+ this.exitCode = exitCode;
19
+ this.details = details;
20
+ }
21
+ }
22
+ export class ApiError extends CliError {
23
+ statusCode;
24
+ errorCode;
25
+ constructor(statusCode, errorCode, message, details) {
26
+ super(message ?? errorCode, exitCodeForApiError(statusCode, errorCode), details);
27
+ this.name = "ApiError";
28
+ this.statusCode = statusCode;
29
+ this.errorCode = errorCode;
30
+ }
31
+ }
32
+ export function exitCodeForApiError(statusCode, errorCode) {
33
+ if (statusCode === 401 || statusCode === 403)
34
+ return EXIT.auth;
35
+ if (errorCode === "insufficient_funds")
36
+ return EXIT.insufficientFunds;
37
+ if (errorCode === "discovery_expired")
38
+ return EXIT.discoveryExpired;
39
+ if (statusCode === 400 || statusCode === 404 || statusCode === 409)
40
+ return EXIT.validation;
41
+ if (statusCode >= 500 || statusCode === 503)
42
+ return EXIT.unavailable;
43
+ return EXIT.generic;
44
+ }
45
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;CACN,CAAC;AAEX,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,QAAQ,CAAS;IACjB,OAAO,CAA2B;IAE3C,YAAY,OAAe,EAAE,WAAmB,IAAI,CAAC,OAAO,EAAE,OAAiC;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,QAAQ;IAC3B,UAAU,CAAS;IACnB,SAAS,CAAS;IAE3B,YAAY,UAAkB,EAAE,SAAiB,EAAE,OAAgB,EAAE,OAAiC;QACpG,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,SAAiB;IACvE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC/D,IAAI,SAAS,KAAK,oBAAoB;QAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC;IACtE,IAAI,SAAS,KAAK,mBAAmB;QAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACpE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3F,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,WAAW,CAAC;IACrE,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function helpText(): string;
2
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAqBjC"}
@@ -0,0 +1,23 @@
1
+ export function helpText() {
2
+ return `Sangria CLI
3
+
4
+ Usage:
5
+ sangria auth status [--json]
6
+ sangria auth set <api_key>
7
+ sangria auth unset
8
+ sangria balance [--json]
9
+ sangria discover <intent> --reasoning <text> [--context <json>] [--json]
10
+ sangria buy <discovery_id> <sku> [--json]
11
+
12
+ Global flags:
13
+ --json Print machine-readable JSON
14
+ --api-key <key> Override SANGRIA_API_KEY or stored config
15
+ --base-url <url> Override SANGRIA_URL or default API URL
16
+ --verbose Print extra diagnostics to stderr
17
+
18
+ Auth:
19
+ SANGRIA_API_KEY takes precedence over stored config.
20
+ Stored config lives at ~/.config/sangria/config.json.
21
+ `;
22
+ }
23
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ;IACtB,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const MICROUNITS_PER_DOLLAR = 1000000;
2
+ export declare function usdString(microunits: number): string;
3
+ export declare function formatUsd(microunits: number): string;
4
+ export declare function withUsd<T extends {
5
+ price_microunits?: number;
6
+ balance_microunits?: number;
7
+ }>(value: T): T & {
8
+ price_usd?: string;
9
+ balance_usd?: string;
10
+ };
11
+ //# sourceMappingURL=money.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../../src/lib/money.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAE/C,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1F,KAAK,EAAE,CAAC,GACP,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAUlD"}
@@ -0,0 +1,19 @@
1
+ export const MICROUNITS_PER_DOLLAR = 1_000_000;
2
+ export function usdString(microunits) {
3
+ return (microunits / MICROUNITS_PER_DOLLAR).toFixed(2);
4
+ }
5
+ export function formatUsd(microunits) {
6
+ return `$${usdString(microunits)}`;
7
+ }
8
+ export function withUsd(value) {
9
+ return {
10
+ ...value,
11
+ ...(typeof value.price_microunits === "number" && {
12
+ price_usd: usdString(value.price_microunits),
13
+ }),
14
+ ...(typeof value.balance_microunits === "number" && {
15
+ balance_usd: usdString(value.balance_microunits),
16
+ }),
17
+ };
18
+ }
19
+ //# sourceMappingURL=money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.js","sourceRoot":"","sources":["../../src/lib/money.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAE/C,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,OAAO,CAAC,UAAU,GAAG,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,KAAQ;IAER,OAAO;QACL,GAAG,KAAK;QACR,GAAG,CAAC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,IAAI;YAChD,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC;SAC7C,CAAC;QACF,GAAG,CAAC,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ,IAAI;YAClD,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC;SACjD,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { BalanceResponse, BuyResponse, DiscoverResponse } from "../types/api.js";
2
+ export declare function printJson(value: unknown): void;
3
+ export declare function printBalance(balance: BalanceResponse): void;
4
+ export declare function printDiscover(result: DiscoverResponse): void;
5
+ export declare function printBuy(result: BuyResponse): void;
6
+ export declare function addDisplayFieldsToBalance(balance: BalanceResponse): BalanceResponse & {
7
+ balance_usd: string;
8
+ };
9
+ export declare function addDisplayFieldsToDiscover(result: DiscoverResponse): DiscoverResponse;
10
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAkB5D;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAclD;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAK7G;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAQrF"}
@@ -0,0 +1,55 @@
1
+ import { formatUsd, usdString } from "./money.js";
2
+ export function printJson(value) {
3
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
4
+ }
5
+ export function printBalance(balance) {
6
+ process.stdout.write(`Balance: ${formatUsd(balance.balance_microunits)}\n`);
7
+ }
8
+ export function printDiscover(result) {
9
+ process.stdout.write(`Discovery: ${result.discovery_id}\n`);
10
+ process.stdout.write(`Expires: ${result.expires_at}\n\n`);
11
+ if (result.matches.length === 0) {
12
+ process.stdout.write("No matches found.\n");
13
+ return;
14
+ }
15
+ result.matches.forEach((match, index) => {
16
+ process.stdout.write(`${index + 1}. ${match.name}\n`);
17
+ process.stdout.write(` SKU: ${match.sku}\n`);
18
+ process.stdout.write(` Price: ${formatUsd(match.price_microunits)}\n`);
19
+ if (typeof match.score === "number") {
20
+ process.stdout.write(` Score: ${match.score.toFixed(2)}\n`);
21
+ }
22
+ if (index < result.matches.length - 1)
23
+ process.stdout.write("\n");
24
+ });
25
+ }
26
+ export function printBuy(result) {
27
+ process.stdout.write(`Order: ${result.order_id}\n`);
28
+ process.stdout.write(`Status: ${result.status}\n`);
29
+ if (result.status === "failed") {
30
+ process.stdout.write(`\nFailure: ${result.failure_code ?? "unknown"}\n`);
31
+ if (result.failure_message)
32
+ process.stdout.write(`${result.failure_message}\n`);
33
+ return;
34
+ }
35
+ if (result.result !== undefined) {
36
+ process.stdout.write("\nMerchant result:\n");
37
+ process.stdout.write(`${JSON.stringify(result.result, null, 2)}\n`);
38
+ }
39
+ }
40
+ export function addDisplayFieldsToBalance(balance) {
41
+ return {
42
+ ...balance,
43
+ balance_usd: usdString(balance.balance_microunits),
44
+ };
45
+ }
46
+ export function addDisplayFieldsToDiscover(result) {
47
+ return {
48
+ ...result,
49
+ matches: result.matches.map((match) => ({
50
+ ...match,
51
+ price_usd: usdString(match.price_microunits),
52
+ })),
53
+ };
54
+ }
55
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface BalanceResponse {
2
+ balance_microunits: number;
3
+ }
4
+ export interface DiscoveryMatch {
5
+ sku: string;
6
+ name: string;
7
+ category: string;
8
+ price_microunits: number;
9
+ quantity: number;
10
+ score: number;
11
+ image_url?: string | null;
12
+ product_url?: string | null;
13
+ rating?: number | null;
14
+ num_reviews?: number | null;
15
+ }
16
+ export interface DiscoverResponse {
17
+ discovery_id: string;
18
+ matches: DiscoveryMatch[];
19
+ expires_at: string;
20
+ }
21
+ export interface BuyResponse {
22
+ order_id: string;
23
+ discovery_id: string;
24
+ sku: string;
25
+ status: "completed" | "failed" | "running" | string;
26
+ created_at: string;
27
+ completed_at?: string;
28
+ failed_at?: string;
29
+ result?: unknown;
30
+ failure_code?: string;
31
+ failure_message?: string;
32
+ }
33
+ export interface ErrorResponse {
34
+ error?: string;
35
+ missing_field?: string;
36
+ }
37
+ export interface DiscoverRequest {
38
+ intent: string;
39
+ reasoning: string;
40
+ context?: unknown;
41
+ }
42
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@sangria-sdk/cli",
3
+ "version": "0.1.0",
4
+ "description": "Sangria agent CLI for discovery and buying",
5
+ "type": "module",
6
+ "bin": {
7
+ "sangria": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsx src/cli.ts",
16
+ "prepublishOnly": "pnpm build"
17
+ },
18
+ "keywords": [
19
+ "sangria",
20
+ "agents",
21
+ "cli",
22
+ "x402"
23
+ ],
24
+ "engines": {
25
+ "node": ">=18"
26
+ },
27
+ "license": "MIT",
28
+ "devDependencies": {
29
+ "@types/node": "^25.6.0",
30
+ "tsx": "^4.21.0",
31
+ "typescript": "^5.7.0"
32
+ },
33
+ "packageManager": "pnpm@8.15.8+sha512.d1a029e1a447ad90bc96cd58b0fad486d2993d531856396f7babf2d83eb1823bb83c5a3d0fc18f675b2d10321d49eb161fece36fe8134aa5823ecd215feed392"
34
+ }