@heossi/qnsi 0.5.2 → 0.5.5
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/CHANGELOG.md +8 -0
- package/README.md +1 -1
- package/dist/cli/commands/kms.d.ts.map +1 -1
- package/dist/cli/commands/kms.js +25 -2
- package/dist/cli/commands/kms.js.map +1 -1
- package/dist/cli/commands/test-utils.d.ts.map +1 -1
- package/dist/cli/commands/test-utils.js +3 -0
- package/dist/cli/commands/test-utils.js.map +1 -1
- package/dist/cli/config.d.ts +15 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +46 -9
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +17 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/auth.d.ts +1 -0
- package/dist/cli/utils/auth.d.ts.map +1 -1
- package/dist/cli/utils/auth.js +60 -0
- package/dist/cli/utils/auth.js.map +1 -1
- package/package.json +2 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @heossi/qnsi
|
|
2
2
|
|
|
3
|
+
## 0.5.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d9ab7af: Bump `@noble/post-quantum` 0.6.0 → 0.6.1 (the SDK's pure-JS / cross-verification PQC provider).
|
|
8
|
+
|
|
9
|
+
Cryptographically equivalent to 0.6.0: the regenerated NIST ACVP determinism vectors confirm keygen output is byte-identical (every ML-KEM / ML-DSA / SLH-DSA key SHA-256 matched the 0.6.0 values), and the published conformance run is unchanged (noble 435/435 against the official NIST ACVP test vectors). No API or behavior change — the dependency floor moves to the latest patch.
|
|
10
|
+
|
|
3
11
|
## 0.3.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
The official **single-package** Node.js / TypeScript SDK for QNSI. Covers the full customer-facing platform — vault, KMS, audit, auth, tenant, access-control, billing, crypto-inventory, storage, search, and AI orchestrator — plus webhook signature verification. Mirrors the shape of the `qnsi` Python / Go / Rust SDKs byte-for-byte: same wire contracts, same algorithm names, same FIPS 203 / 204 / 205 posture.
|
|
7
7
|
|
|
8
|
-
> **Free tier
|
|
8
|
+
> **Platform:** <https://qnsi.heossi.com> · **Free tier:** free-forever account at <https://cloud.qnsi.heossi.com/auth> — 60-second signup, no credit card. Includes 10 GB PQC storage, 50 000 API calls/month, 20 KMS keys, 25 vault secrets.
|
|
9
9
|
|
|
10
10
|
## Why one package?
|
|
11
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/kms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/kms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CA0L7E"}
|
package/dist/cli/commands/kms.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
1
2
|
import { EXIT_CODES } from "../config.js";
|
|
2
3
|
import { getAuthHeaders } from "../utils/auth.js";
|
|
3
4
|
import { getEffectiveConfig } from "../utils/command-config.js";
|
|
@@ -115,11 +116,33 @@ export function registerKmsCommands(program, config) {
|
|
|
115
116
|
return process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
116
117
|
}
|
|
117
118
|
const headers = await getAuthHeaders(effectiveConfig);
|
|
119
|
+
// WIRE CONTRACT (kms-service createKeySchema):
|
|
120
|
+
// { tenantId, keyId (REQUIRED, 1-255), keyType (root|master|data|byok),
|
|
121
|
+
// algorithm, metadata }
|
|
122
|
+
//
|
|
123
|
+
// This sent `{ tenantId, name, algorithm, purpose }` — no keyId, no keyType, and
|
|
124
|
+
// two fields (`name`, `purpose`) the backend does not know. It returned 400
|
|
125
|
+
// EVERY TIME: the command had never created a key. Proven 2026-07-14 against
|
|
126
|
+
// production with a real API key:
|
|
127
|
+
//
|
|
128
|
+
// fieldErrors: { keyId: ["expected string, received undefined"],
|
|
129
|
+
// keyType: ["expected one of root|master|data|byok"] }
|
|
130
|
+
//
|
|
131
|
+
// Identical to the MCP server's qnsp_kms_generate_key. Backend Zod objects are
|
|
132
|
+
// NON-STRICT, so `name`/`purpose` were silently STRIPPED and the two required
|
|
133
|
+
// fields simply never arrived — which is why the failure never named itself.
|
|
134
|
+
// They belong in metadata, exactly as the (proven) SDK does.
|
|
135
|
+
const metadata = {};
|
|
136
|
+
if (options.name)
|
|
137
|
+
metadata["name"] = String(options.name);
|
|
138
|
+
if (options.purpose)
|
|
139
|
+
metadata["purpose"] = String(options.purpose);
|
|
118
140
|
const body = {
|
|
119
141
|
tenantId: effectiveConfig.tenantId,
|
|
120
|
-
|
|
142
|
+
keyId: randomUUID(),
|
|
143
|
+
keyType: "data",
|
|
121
144
|
algorithm: options.algorithm,
|
|
122
|
-
|
|
145
|
+
metadata,
|
|
123
146
|
};
|
|
124
147
|
const response = await fetchWithBackendHandling(effectiveConfig, `${effectiveConfig.kmsServiceUrl}/kms/v1/keys`, {
|
|
125
148
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kms.js","sourceRoot":"","sources":["../../../src/cli/commands/kms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kms.js","sourceRoot":"","sources":["../../../src/cli/commands/kms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B;AAGD,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,OAAO,EACb,MAAM,SAAM,EACZ,EAAE,UAAO,EACT,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,QAAQ,CAgBV;AAED,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,2GAA2G;AAC3G,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B;AAGD,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,OAAO,EACb,MAAM,SAAM,EACZ,EAAE,UAAO,EACT,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,QAAQ,CAgBV;AAED,eAAO,MAAM,UAAU,EAAE,SAsBxB,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,eAAe,CAmCtD"}
|
|
@@ -20,6 +20,9 @@ export const mockConfig = {
|
|
|
20
20
|
edgeGatewayUrl: null,
|
|
21
21
|
cloudPortalUrl: "https://cloud.qnsi.heossi.com",
|
|
22
22
|
authServiceUrl: "http://localhost:8081",
|
|
23
|
+
// null = exercise the service-account path, which is what these tests cover.
|
|
24
|
+
// The api-key path is covered separately (utils/auth.test.ts).
|
|
25
|
+
apiKey: null,
|
|
23
26
|
serviceId: "test-service-id",
|
|
24
27
|
serviceSecret: "test-secret",
|
|
25
28
|
tenantId: "test-tenant",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/cli/commands/test-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../../src/cli/commands/test-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -2,6 +2,21 @@ export interface CliConfig {
|
|
|
2
2
|
readonly edgeGatewayUrl: string | null;
|
|
3
3
|
readonly cloudPortalUrl: string;
|
|
4
4
|
readonly authServiceUrl: string;
|
|
5
|
+
/**
|
|
6
|
+
* A customer's API key (QNSI_API_KEY) — the ONLY credential a customer actually has.
|
|
7
|
+
*
|
|
8
|
+
* The CLI ships as the `qnsi` bin inside @heossi/qnsi, the package every customer
|
|
9
|
+
* installs, yet it had NO api-key path at all: it required QNSI_SERVICE_ID +
|
|
10
|
+
* QNSI_SERVICE_SECRET + QNSI_TENANT_ID — internal service-account credentials. Proven
|
|
11
|
+
* 2026-07-14: `qnsi kms keys list` with a real API key exited with
|
|
12
|
+
* "Error: QNSI_SERVICE_ID must be set". The word `apiKey` appeared exactly once in the
|
|
13
|
+
* whole CLI, in a log-sanitiser regex.
|
|
14
|
+
*
|
|
15
|
+
* When this is set, the CLI activates it (resolving the tenant automatically, like the
|
|
16
|
+
* SDK does) and uses it as the bearer. The service-account path is unchanged for
|
|
17
|
+
* internal/ops use.
|
|
18
|
+
*/
|
|
19
|
+
readonly apiKey: string | null;
|
|
5
20
|
readonly serviceId: string | null;
|
|
6
21
|
readonly serviceSecret: string | null;
|
|
7
22
|
readonly tenantId: string | null;
|
package/dist/cli/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AA8CD,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CA2FpE;AAED,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC"}
|
package/dist/cli/config.js
CHANGED
|
@@ -7,6 +7,30 @@ const shouldLoadDotenv = (process.env["NODE_ENV"] ?? "development") !== "product
|
|
|
7
7
|
if (shouldLoadDotenv) {
|
|
8
8
|
loadDotenv();
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Build a service base URL.
|
|
12
|
+
*
|
|
13
|
+
* THE PREFIX MUST NOT BE APPLIED TWICE. The edge gateway strips only `/proxy` and forwards
|
|
14
|
+
* the rest, so a call to `/proxy/kms/v1/keys` reaches kms-service as `/kms/v1/keys` — which
|
|
15
|
+
* is exactly its route. And EVERY CLI command already appends the service-prefixed path
|
|
16
|
+
* (`${kmsServiceUrl}/kms/v1/keys`, `${vaultServiceUrl}/vault/v1/secrets`, …).
|
|
17
|
+
*
|
|
18
|
+
* So `proxyPath` must be EMPTY for those services. It was `/kms`, `/vault`, `/audit`, …, so
|
|
19
|
+
* the CLI built `/proxy/kms` + `/kms/v1/keys` = `/proxy/kms/kms/v1/keys`, and the service
|
|
20
|
+
* answered:
|
|
21
|
+
*
|
|
22
|
+
* 404 Route GET:/kms/kms/v1/keys not found
|
|
23
|
+
*
|
|
24
|
+
* Eight of eleven command groups did this. The CLI had NEVER worked against production — it
|
|
25
|
+
* only ever worked with explicit per-service QNSI_*_SERVICE_URL pointing at localhost, where
|
|
26
|
+
* the command's own prefix is the whole path. Proven 2026-07-14 with a real API key.
|
|
27
|
+
*
|
|
28
|
+
* Two services genuinely DO need a prefix, and they keep it:
|
|
29
|
+
* - storage: production really is `/proxy/storage/storage/v1/...` (the double is real; the
|
|
30
|
+
* storage command appends `/storage/v1/...`).
|
|
31
|
+
* - billing: the billing commands append `/addons`, `/v1/usage` — no service prefix of
|
|
32
|
+
* their own — so the base must carry `/billing`.
|
|
33
|
+
*/
|
|
10
34
|
function deriveViaEdgeGateway(options) {
|
|
11
35
|
const explicit = process.env[options.envVar];
|
|
12
36
|
if (explicit && explicit.length > 0) {
|
|
@@ -17,38 +41,51 @@ function deriveViaEdgeGateway(options) {
|
|
|
17
41
|
}
|
|
18
42
|
return options.localDefault;
|
|
19
43
|
}
|
|
44
|
+
/** The production edge gateway — the same default the SDK ships with. */
|
|
45
|
+
const DEFAULT_EDGE_GATEWAY_URL = "https://api.qnsi.heossi.com";
|
|
20
46
|
export function loadConfig(overrides) {
|
|
21
|
-
|
|
47
|
+
// DEFAULT TO PRODUCTION, exactly as the SDK does (QnsiClientOptions.baseUrl defaults to
|
|
48
|
+
// https://api.qnsi.heossi.com).
|
|
49
|
+
//
|
|
50
|
+
// This was `?? null`, and every service URL derives from it — so with no
|
|
51
|
+
// QNSI_EDGE_GATEWAY_URL the CLI silently pointed at http://localhost:8095 and a
|
|
52
|
+
// customer's very first command died with "fetch failed". A published CLI that defaults
|
|
53
|
+
// to localhost is a CLI that has never been run by anyone outside this repo.
|
|
54
|
+
//
|
|
55
|
+
// Local development still works: set QNSI_EDGE_GATEWAY_URL, or any per-service
|
|
56
|
+
// QNSI_*_SERVICE_URL, and it wins.
|
|
57
|
+
const edgeGatewayUrl = process.env["QNSI_EDGE_GATEWAY_URL"] ?? DEFAULT_EDGE_GATEWAY_URL;
|
|
22
58
|
const cloudPortalUrl = process.env["QNSI_CLOUD_PORTAL_URL"] ?? "https://cloud.qnsi.heossi.com";
|
|
23
59
|
const defaults = {
|
|
24
60
|
edgeGatewayUrl,
|
|
25
61
|
cloudPortalUrl,
|
|
26
62
|
authServiceUrl: process.env["QNSI_AUTH_SERVICE_URL"] ?? edgeGatewayUrl ?? "http://localhost:8081",
|
|
63
|
+
apiKey: process.env["QNSI_API_KEY"] ?? process.env["QNSP_API_KEY"] ?? null,
|
|
27
64
|
serviceId: process.env["QNSI_SERVICE_ID"] ?? null,
|
|
28
65
|
serviceSecret: process.env["QNSI_SERVICE_SECRET"] ?? null,
|
|
29
66
|
tenantId: process.env["QNSI_TENANT_ID"] ?? null,
|
|
30
67
|
kmsServiceUrl: deriveViaEdgeGateway({
|
|
31
68
|
edgeGatewayUrl,
|
|
32
69
|
envVar: "QNSI_KMS_SERVICE_URL",
|
|
33
|
-
proxyPath: "
|
|
70
|
+
proxyPath: "",
|
|
34
71
|
localDefault: "http://localhost:8095",
|
|
35
72
|
}),
|
|
36
73
|
vaultServiceUrl: deriveViaEdgeGateway({
|
|
37
74
|
edgeGatewayUrl,
|
|
38
75
|
envVar: "QNSI_VAULT_SERVICE_URL",
|
|
39
|
-
proxyPath: "
|
|
76
|
+
proxyPath: "",
|
|
40
77
|
localDefault: "http://localhost:8090",
|
|
41
78
|
}),
|
|
42
79
|
auditServiceUrl: deriveViaEdgeGateway({
|
|
43
80
|
edgeGatewayUrl,
|
|
44
81
|
envVar: "QNSI_AUDIT_SERVICE_URL",
|
|
45
|
-
proxyPath: "
|
|
82
|
+
proxyPath: "",
|
|
46
83
|
localDefault: "http://localhost:8103",
|
|
47
84
|
}),
|
|
48
85
|
tenantServiceUrl: deriveViaEdgeGateway({
|
|
49
86
|
edgeGatewayUrl,
|
|
50
87
|
envVar: "QNSI_TENANT_SERVICE_URL",
|
|
51
|
-
proxyPath: "
|
|
88
|
+
proxyPath: "",
|
|
52
89
|
localDefault: "http://localhost:8108",
|
|
53
90
|
}),
|
|
54
91
|
billingServiceUrl: deriveViaEdgeGateway({
|
|
@@ -63,13 +100,13 @@ export function loadConfig(overrides) {
|
|
|
63
100
|
accessControlServiceUrl: deriveViaEdgeGateway({
|
|
64
101
|
edgeGatewayUrl,
|
|
65
102
|
envVar: "QNSI_ACCESS_CONTROL_SERVICE_URL",
|
|
66
|
-
proxyPath: "
|
|
103
|
+
proxyPath: "",
|
|
67
104
|
localDefault: "http://localhost:8102",
|
|
68
105
|
}),
|
|
69
106
|
securityMonitoringServiceUrl: deriveViaEdgeGateway({
|
|
70
107
|
edgeGatewayUrl,
|
|
71
108
|
envVar: "QNSI_SECURITY_MONITORING_SERVICE_URL",
|
|
72
|
-
proxyPath: "
|
|
109
|
+
proxyPath: "",
|
|
73
110
|
localDefault: "http://localhost:8104",
|
|
74
111
|
}),
|
|
75
112
|
storageServiceUrl: deriveViaEdgeGateway({
|
|
@@ -81,13 +118,13 @@ export function loadConfig(overrides) {
|
|
|
81
118
|
searchServiceUrl: deriveViaEdgeGateway({
|
|
82
119
|
edgeGatewayUrl,
|
|
83
120
|
envVar: "QNSI_SEARCH_SERVICE_URL",
|
|
84
|
-
proxyPath: "
|
|
121
|
+
proxyPath: "",
|
|
85
122
|
localDefault: "http://localhost:8101",
|
|
86
123
|
}),
|
|
87
124
|
observabilityServiceUrl: deriveViaEdgeGateway({
|
|
88
125
|
edgeGatewayUrl,
|
|
89
126
|
envVar: "QNSI_OBSERVABILITY_SERVICE_URL",
|
|
90
|
-
proxyPath: "
|
|
127
|
+
proxyPath: "",
|
|
91
128
|
localDefault: "http://localhost:8105",
|
|
92
129
|
}),
|
|
93
130
|
outputFormat: process.env["QNSI_OUTPUT_FORMAT"] ?? "table",
|
package/dist/cli/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,kEAAkE;AAClE,aAAa,EAAE,CAAC;AAEhB,MAAM,gBAAgB,GACrB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,KAAK,YAAY;IAC3D,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,MAAM,CAAC;AAEtD,IAAI,gBAAgB,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC;AACd,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -14,6 +14,7 @@ import { registerStorageCommands } from "./commands/storage.js";
|
|
|
14
14
|
import { registerTenantCommands } from "./commands/tenant.js";
|
|
15
15
|
import { registerVaultCommands } from "./commands/vault.js";
|
|
16
16
|
import { loadConfig } from "./config.js";
|
|
17
|
+
import { resolveApiKeyTenant } from "./utils/auth.js";
|
|
17
18
|
const program = new Command();
|
|
18
19
|
program
|
|
19
20
|
.name("qnsi")
|
|
@@ -37,7 +38,22 @@ program
|
|
|
37
38
|
.option("--observability-service-url <url>", "Observability service URL")
|
|
38
39
|
.option("--output <format>", "Output format: json, table, yaml", "table")
|
|
39
40
|
.option("--verbose", "Enable verbose output");
|
|
40
|
-
const
|
|
41
|
+
const baseConfig = loadConfig();
|
|
42
|
+
/**
|
|
43
|
+
* With an API key, the tenant resolves from the activation handshake — a customer should
|
|
44
|
+
* never have to look up and export their own tenant UUID.
|
|
45
|
+
*
|
|
46
|
+
* Every command guards on `config.tenantId` and exits with "QNSI_TENANT_ID must be set".
|
|
47
|
+
* That is fine for the service-account path (an ops operator knows the tenant), but a
|
|
48
|
+
* customer holding only an API key had no way through: the CLI demanded QNSI_SERVICE_ID,
|
|
49
|
+
* QNSI_SERVICE_SECRET *and* QNSI_TENANT_ID — none of which they have.
|
|
50
|
+
*
|
|
51
|
+
* Resolving once here, before the commands are registered, means every existing command
|
|
52
|
+
* works with an API key and nothing downstream changes.
|
|
53
|
+
*/
|
|
54
|
+
const config = baseConfig.apiKey && !baseConfig.tenantId
|
|
55
|
+
? { ...baseConfig, tenantId: await resolveApiKeyTenant(baseConfig) }
|
|
56
|
+
: baseConfig;
|
|
41
57
|
registerAuthCommands(program, config);
|
|
42
58
|
registerKmsCommands(program, config);
|
|
43
59
|
registerVaultCommands(program, config);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,UAAU,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/utils/auth.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CliConfig } from "../config.js";
|
|
2
2
|
export declare function requestServiceToken(config: CliConfig): Promise<string | null>;
|
|
3
|
+
export declare function resolveApiKeyTenant(config: CliConfig): Promise<string | null>;
|
|
3
4
|
export declare function getAuthHeaders(config: CliConfig): Promise<Record<string, string>>;
|
|
4
5
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAc9C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuFnF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAc9C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuFnF;AAQD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBnF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2CvF"}
|
package/dist/cli/utils/auth.js
CHANGED
|
@@ -82,7 +82,67 @@ export async function requestServiceToken(config) {
|
|
|
82
82
|
process.exit(EXIT_CODES.NETWORK_ERROR);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Resolve the tenant that owns an API key, by activating it — the same handshake the SDK
|
|
87
|
+
* performs on its first call. Cached for the life of the process.
|
|
88
|
+
*/
|
|
89
|
+
let cachedApiKeyTenant = null;
|
|
90
|
+
export async function resolveApiKeyTenant(config) {
|
|
91
|
+
if (!config.apiKey)
|
|
92
|
+
return null;
|
|
93
|
+
if (config.tenantId)
|
|
94
|
+
return config.tenantId; // an explicit tenant always wins
|
|
95
|
+
if (cachedApiKeyTenant?.key === config.apiKey)
|
|
96
|
+
return cachedApiKeyTenant.tenantId;
|
|
97
|
+
const base = (config.edgeGatewayUrl ?? "https://api.qnsi.heossi.com").replace(/\/$/, "");
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(`${base}/proxy/billing/v1/sdk/activate`, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers: {
|
|
102
|
+
authorization: `Bearer ${config.apiKey}`,
|
|
103
|
+
"content-type": "application/json",
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify({ sdkId: "qnsp", sdkVersion: "cli", runtime: "node" }),
|
|
106
|
+
signal: AbortSignal.timeout(15_000),
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok)
|
|
109
|
+
return null;
|
|
110
|
+
const body = (await response.json());
|
|
111
|
+
if (typeof body.tenantId !== "string" || body.tenantId.length === 0)
|
|
112
|
+
return null;
|
|
113
|
+
cachedApiKeyTenant = { key: config.apiKey, tenantId: body.tenantId };
|
|
114
|
+
return body.tenantId;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
85
120
|
export async function getAuthHeaders(config) {
|
|
121
|
+
// ── API-KEY PATH (what a CUSTOMER actually has) ──────────────────────────────
|
|
122
|
+
//
|
|
123
|
+
// The CLI ships as the `qnsi` bin inside @heossi/qnsi — the package every customer
|
|
124
|
+
// installs — but it had NO api-key path: it demanded QNSI_SERVICE_ID +
|
|
125
|
+
// QNSI_SERVICE_SECRET, which are INTERNAL service-account credentials. Proven
|
|
126
|
+
// 2026-07-14 against production: `qnsi kms keys list` with a real API key exited
|
|
127
|
+
// "Error: QNSI_SERVICE_ID must be set". The shipped CLI was unusable by the audience
|
|
128
|
+
// it shipped to — advertised-not-built, aimed straight at developers.
|
|
129
|
+
//
|
|
130
|
+
// The API key IS a bearer credential at the edge gateway (that is exactly how every
|
|
131
|
+
// SDK authenticates), and the tenant resolves from the activation handshake — so a
|
|
132
|
+
// customer needs nothing but their key.
|
|
133
|
+
if (config.apiKey) {
|
|
134
|
+
const headers = {
|
|
135
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
136
|
+
"Content-Type": "application/json",
|
|
137
|
+
};
|
|
138
|
+
const tenantId = await resolveApiKeyTenant(config);
|
|
139
|
+
if (tenantId) {
|
|
140
|
+
headers["x-qnsp-tenant"] = tenantId;
|
|
141
|
+
headers["x-tenant-id"] = tenantId;
|
|
142
|
+
}
|
|
143
|
+
return headers;
|
|
144
|
+
}
|
|
145
|
+
// ── SERVICE-ACCOUNT PATH (internal / ops) — unchanged ────────────────────────
|
|
86
146
|
const token = await requestServiceToken(config);
|
|
87
147
|
if (!token) {
|
|
88
148
|
process.exit(EXIT_CODES.AUTH_ERROR);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/utils/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/utils/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,eAAe,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAMnD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB;IAC1D,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvB,UAAU,CAAC,6BAA6B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM,EAAE,CAAC;QACZ,YAAY,CAAC,4BAA4B,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,YAAY,CAAC,+CAA+C,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9E,aAAa,GAAG,MAAM,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACP,UAAU,CAAC,wDAAwD,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAED,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAErF,IAAI,CAAC;QACJ,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACrC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;IAED,YAAY,CAAC,iCAAiC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvF,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,cAAc,qBAAqB,EAAE;YAC3E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,aAAa,EAAE;aACxC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,kBAAkB;aAC5B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,SAAkB,CAAC;YACvB,IAAI,CAAC;gBACJ,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YACtD,CAAC;YAED,IACC,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,MAAM,KAAK,GAAG,EACtB,CAAC;gBACF,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;gBACtE,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;YAED,UAAU,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,YAAY,CAAC,qCAAqC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEpE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3D,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvD,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,UAAU,CAAC,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,IAAI,kBAAkB,GAA6C,IAAI,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB;IAC1D,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,iCAAiC;IAC9E,IAAI,kBAAkB,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IAElF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,6BAA6B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzF,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,gCAAgC,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;gBACxC,cAAc,EAAE,kBAAkB;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;QAC/D,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjF,kBAAkB,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAiB;IACrD,gFAAgF;IAChF,EAAE;IACF,mFAAmF;IACnF,uEAAuE;IACvE,8EAA8E;IAC9E,iFAAiF;IACjF,qFAAqF;IACrF,sEAAsE;IACtE,EAAE;IACF,oFAAoF;IACpF,mFAAmF;IACnF,wCAAwC;IACxC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,GAA2B;YACvC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;SAClC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC;YACpC,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,gFAAgF;IAChF,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,OAAO,GAA2B;QACvC,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,cAAc,EAAE,kBAAkB;KAClC,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3C,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heossi/qnsi",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -48,16 +48,12 @@
|
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"@langchain/core": ">=0.3.0",
|
|
51
|
-
"autogen": ">=0.0.1",
|
|
52
51
|
"llamaindex": ">=0.5.0"
|
|
53
52
|
},
|
|
54
53
|
"peerDependenciesMeta": {
|
|
55
54
|
"@langchain/core": {
|
|
56
55
|
"optional": true
|
|
57
56
|
},
|
|
58
|
-
"autogen": {
|
|
59
|
-
"optional": true
|
|
60
|
-
},
|
|
61
57
|
"llamaindex": {
|
|
62
58
|
"optional": true
|
|
63
59
|
}
|
|
@@ -99,7 +95,7 @@
|
|
|
99
95
|
"url": "https://github.com/heossihq/qnsi-public",
|
|
100
96
|
"directory": "packages/qnsi"
|
|
101
97
|
},
|
|
102
|
-
"homepage": "https://
|
|
98
|
+
"homepage": "https://qnsi.heossi.com",
|
|
103
99
|
"bugs": {
|
|
104
100
|
"url": "https://github.com/heossihq/qnsi-public/issues"
|
|
105
101
|
},
|