@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.
- package/README.md +49 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +79 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +74 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +13 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/buy.d.ts +3 -0
- package/dist/commands/buy.d.ts.map +1 -0
- package/dist/commands/buy.js +17 -0
- package/dist/commands/buy.js.map +1 -0
- package/dist/commands/discover.d.ts +6 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +31 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/types.d.ts +7 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/lib/args.d.ts +8 -0
- package/dist/lib/args.d.ts.map +1 -0
- package/dist/lib/args.js +39 -0
- package/dist/lib/args.js.map +1 -0
- package/dist/lib/client.d.ts +14 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +101 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +62 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +23 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +45 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/help.d.ts +2 -0
- package/dist/lib/help.d.ts.map +1 -0
- package/dist/lib/help.js +23 -0
- package/dist/lib/help.js.map +1 -0
- package/dist/lib/money.d.ts +11 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +19 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/output.d.ts +10 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +55 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/types/api.d.ts +42 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- 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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/lib/args.js
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,IAAI,MAAM,CAqBjC"}
|
package/dist/lib/help.js
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|