@indigoai-us/hq-cloud 5.19.0 → 5.19.1
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/dist/client-info.d.ts +44 -0
- package/dist/client-info.d.ts.map +1 -0
- package/dist/client-info.js +112 -0
- package/dist/client-info.js.map +1 -0
- package/dist/client-info.test.d.ts +11 -0
- package/dist/client-info.test.d.ts.map +1 -0
- package/dist/client-info.test.js +168 -0
- package/dist/client-info.test.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +10 -2
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/vault-client.d.ts +1 -0
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +4 -0
- package/dist/vault-client.js.map +1 -1
- package/package.json +1 -1
- package/src/client-info.test.ts +214 -0
- package/src/client-info.ts +121 -0
- package/src/context.ts +10 -2
- package/src/index.ts +12 -0
- package/src/types.ts +23 -0
- package/src/vault-client.ts +5 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client identification — every HQ client that talks to hq-cloud-api should
|
|
3
|
+
* stamp its name and version on outbound requests so the server can attribute
|
|
4
|
+
* traffic, gate on minimum versions, and surface deprecation warnings.
|
|
5
|
+
*
|
|
6
|
+
* The CLI in particular sends a third header (`x-hq-core-version`) when it's
|
|
7
|
+
* invoked from inside an hq-core checkout, so the server sees which scaffold
|
|
8
|
+
* generation the user is running against.
|
|
9
|
+
*/
|
|
10
|
+
import type { ClientInfo } from "./types.js";
|
|
11
|
+
export declare const HEADER_CLIENT_NAME = "x-hq-client-name";
|
|
12
|
+
export declare const HEADER_CLIENT_VERSION = "x-hq-client-version";
|
|
13
|
+
export declare const HEADER_HQ_CORE_VERSION = "x-hq-core-version";
|
|
14
|
+
/**
|
|
15
|
+
* Build the set of `x-hq-*` headers (plus a derived `User-Agent`) for a
|
|
16
|
+
* ClientInfo. Returns an empty object when info is undefined so callers can
|
|
17
|
+
* spread the result unconditionally.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildClientHeaders(info: ClientInfo | undefined): Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Build a ClientInfo from a parsed package.json. Most consumers will call this
|
|
22
|
+
* once at startup and pass the result into every VaultServiceConfig.
|
|
23
|
+
*/
|
|
24
|
+
export declare function clientInfoFromPackage(pkg: {
|
|
25
|
+
name?: unknown;
|
|
26
|
+
version?: unknown;
|
|
27
|
+
}): ClientInfo;
|
|
28
|
+
/**
|
|
29
|
+
* Walk upward from `startDir` looking for `core/core.yaml`. When found, parse
|
|
30
|
+
* out the `hqVersion` field and return it. Returns undefined if we never find
|
|
31
|
+
* an hq-core checkout — i.e. the caller is running from a plain user dir.
|
|
32
|
+
*
|
|
33
|
+
* Honors `HQ_HOME` env var as an explicit override so multi-checkout setups
|
|
34
|
+
* (e.g. CI bots, the menubar app pointing at a non-cwd HQ root) can pin the
|
|
35
|
+
* detection without relying on cwd.
|
|
36
|
+
*
|
|
37
|
+
* Why a regex instead of a YAML parser: `core.yaml` lives at the very top of
|
|
38
|
+
* the file and the field has a stable shape — adding a YAML dep just to read
|
|
39
|
+
* one string would balloon every consumer's bundle. The current shape is
|
|
40
|
+
* `hqVersion: "X.Y.Z"` (quoted) per the canonical seed; we tolerate unquoted
|
|
41
|
+
* too.
|
|
42
|
+
*/
|
|
43
|
+
export declare function detectHqCoreVersion(startDir?: string): string | undefined;
|
|
44
|
+
//# sourceMappingURL=client-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.d.ts","sourceRoot":"","sources":["../src/client-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,GAAG,SAAS,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,UAAU,CAQb;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAezE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client identification — every HQ client that talks to hq-cloud-api should
|
|
3
|
+
* stamp its name and version on outbound requests so the server can attribute
|
|
4
|
+
* traffic, gate on minimum versions, and surface deprecation warnings.
|
|
5
|
+
*
|
|
6
|
+
* The CLI in particular sends a third header (`x-hq-core-version`) when it's
|
|
7
|
+
* invoked from inside an hq-core checkout, so the server sees which scaffold
|
|
8
|
+
* generation the user is running against.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { dirname, join, resolve } from "node:path";
|
|
12
|
+
export const HEADER_CLIENT_NAME = "x-hq-client-name";
|
|
13
|
+
export const HEADER_CLIENT_VERSION = "x-hq-client-version";
|
|
14
|
+
export const HEADER_HQ_CORE_VERSION = "x-hq-core-version";
|
|
15
|
+
/**
|
|
16
|
+
* Build the set of `x-hq-*` headers (plus a derived `User-Agent`) for a
|
|
17
|
+
* ClientInfo. Returns an empty object when info is undefined so callers can
|
|
18
|
+
* spread the result unconditionally.
|
|
19
|
+
*/
|
|
20
|
+
export function buildClientHeaders(info) {
|
|
21
|
+
if (!info)
|
|
22
|
+
return {};
|
|
23
|
+
const headers = {
|
|
24
|
+
"User-Agent": `${info.name}/${info.version}`,
|
|
25
|
+
[HEADER_CLIENT_NAME]: info.name,
|
|
26
|
+
[HEADER_CLIENT_VERSION]: info.version,
|
|
27
|
+
};
|
|
28
|
+
if (info.hqCoreVersion) {
|
|
29
|
+
headers[HEADER_HQ_CORE_VERSION] = info.hqCoreVersion;
|
|
30
|
+
}
|
|
31
|
+
if (info.extra) {
|
|
32
|
+
for (const [k, v] of Object.entries(info.extra)) {
|
|
33
|
+
headers[`x-hq-client-${k}`] = v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return headers;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build a ClientInfo from a parsed package.json. Most consumers will call this
|
|
40
|
+
* once at startup and pass the result into every VaultServiceConfig.
|
|
41
|
+
*/
|
|
42
|
+
export function clientInfoFromPackage(pkg) {
|
|
43
|
+
if (typeof pkg.name !== "string" || pkg.name.length === 0) {
|
|
44
|
+
throw new Error("clientInfoFromPackage: package.json is missing a name");
|
|
45
|
+
}
|
|
46
|
+
if (typeof pkg.version !== "string" || pkg.version.length === 0) {
|
|
47
|
+
throw new Error("clientInfoFromPackage: package.json is missing a version");
|
|
48
|
+
}
|
|
49
|
+
return { name: pkg.name, version: pkg.version };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Walk upward from `startDir` looking for `core/core.yaml`. When found, parse
|
|
53
|
+
* out the `hqVersion` field and return it. Returns undefined if we never find
|
|
54
|
+
* an hq-core checkout — i.e. the caller is running from a plain user dir.
|
|
55
|
+
*
|
|
56
|
+
* Honors `HQ_HOME` env var as an explicit override so multi-checkout setups
|
|
57
|
+
* (e.g. CI bots, the menubar app pointing at a non-cwd HQ root) can pin the
|
|
58
|
+
* detection without relying on cwd.
|
|
59
|
+
*
|
|
60
|
+
* Why a regex instead of a YAML parser: `core.yaml` lives at the very top of
|
|
61
|
+
* the file and the field has a stable shape — adding a YAML dep just to read
|
|
62
|
+
* one string would balloon every consumer's bundle. The current shape is
|
|
63
|
+
* `hqVersion: "X.Y.Z"` (quoted) per the canonical seed; we tolerate unquoted
|
|
64
|
+
* too.
|
|
65
|
+
*/
|
|
66
|
+
export function detectHqCoreVersion(startDir) {
|
|
67
|
+
const fromEnv = process.env.HQ_HOME ?? process.env.HQ_ROOT;
|
|
68
|
+
if (fromEnv) {
|
|
69
|
+
const v = readCoreVersionAt(fromEnv);
|
|
70
|
+
if (v)
|
|
71
|
+
return v;
|
|
72
|
+
}
|
|
73
|
+
let dir = resolve(startDir ?? process.cwd());
|
|
74
|
+
while (true) {
|
|
75
|
+
const v = readCoreVersionAt(dir);
|
|
76
|
+
if (v)
|
|
77
|
+
return v;
|
|
78
|
+
const parent = dirname(dir);
|
|
79
|
+
if (parent === dir)
|
|
80
|
+
return undefined;
|
|
81
|
+
dir = parent;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function readCoreVersionAt(hqRoot) {
|
|
85
|
+
// hq-core identity requires BOTH core/core.yaml AND companies/ — matches the
|
|
86
|
+
// CLI's own detection (commit bc827d0). Without this guard, any directory
|
|
87
|
+
// containing a stray `core/core.yaml` (e.g. a test fixture) would be
|
|
88
|
+
// misidentified as an hq-core root.
|
|
89
|
+
const yamlPath = join(hqRoot, "core", "core.yaml");
|
|
90
|
+
const companiesPath = join(hqRoot, "companies");
|
|
91
|
+
let content;
|
|
92
|
+
try {
|
|
93
|
+
content = readFileSync(yamlPath, "utf8");
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
// statSync would be marginally cleaner, but readdirSync of a nonexistent
|
|
100
|
+
// path throws synchronously which is what we want.
|
|
101
|
+
readFileSync(companiesPath, { flag: "r" });
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
const e = err;
|
|
105
|
+
// EISDIR is the success case — companies/ exists and is a directory.
|
|
106
|
+
if (e.code !== "EISDIR")
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const match = /^hqVersion:\s*["']?([^"'\s]+)/m.exec(content);
|
|
110
|
+
return match ? match[1] : undefined;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=client-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.js","sourceRoot":"","sources":["../src/client-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the client-info helpers and header injection.
|
|
3
|
+
*
|
|
4
|
+
* Two layers are exercised here:
|
|
5
|
+
* 1. The pure functions in `client-info.ts` — buildClientHeaders,
|
|
6
|
+
* clientInfoFromPackage, detectHqCoreVersion.
|
|
7
|
+
* 2. End-to-end injection into VaultClient.request, since "the headers
|
|
8
|
+
* actually land on outbound fetch" is the property consumers care about.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=client-info.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.test.d.ts","sourceRoot":"","sources":["../src/client-info.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the client-info helpers and header injection.
|
|
3
|
+
*
|
|
4
|
+
* Two layers are exercised here:
|
|
5
|
+
* 1. The pure functions in `client-info.ts` — buildClientHeaders,
|
|
6
|
+
* clientInfoFromPackage, detectHqCoreVersion.
|
|
7
|
+
* 2. End-to-end injection into VaultClient.request, since "the headers
|
|
8
|
+
* actually land on outbound fetch" is the property consumers care about.
|
|
9
|
+
*/
|
|
10
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
11
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { buildClientHeaders, clientInfoFromPackage, detectHqCoreVersion, HEADER_CLIENT_NAME, HEADER_CLIENT_VERSION, HEADER_HQ_CORE_VERSION, } from "./client-info.js";
|
|
15
|
+
import { VaultClient } from "./vault-client.js";
|
|
16
|
+
describe("buildClientHeaders", () => {
|
|
17
|
+
it("returns empty object when info is undefined", () => {
|
|
18
|
+
expect(buildClientHeaders(undefined)).toEqual({});
|
|
19
|
+
});
|
|
20
|
+
it("emits User-Agent + x-hq-client-{name,version} from name/version", () => {
|
|
21
|
+
const headers = buildClientHeaders({
|
|
22
|
+
name: "@indigoai-us/hq-cli",
|
|
23
|
+
version: "5.15.0",
|
|
24
|
+
});
|
|
25
|
+
expect(headers["User-Agent"]).toBe("@indigoai-us/hq-cli/5.15.0");
|
|
26
|
+
expect(headers[HEADER_CLIENT_NAME]).toBe("@indigoai-us/hq-cli");
|
|
27
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBe("5.15.0");
|
|
28
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
it("includes x-hq-core-version only when hqCoreVersion is set", () => {
|
|
31
|
+
const headers = buildClientHeaders({
|
|
32
|
+
name: "@indigoai-us/hq-cli",
|
|
33
|
+
version: "5.15.0",
|
|
34
|
+
hqCoreVersion: "14.1.0",
|
|
35
|
+
});
|
|
36
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBe("14.1.0");
|
|
37
|
+
});
|
|
38
|
+
it("emits arbitrary extra fields as x-hq-client-<key> headers", () => {
|
|
39
|
+
const headers = buildClientHeaders({
|
|
40
|
+
name: "x",
|
|
41
|
+
version: "1.0.0",
|
|
42
|
+
extra: { machine: "ec2-bot-7", channel: "stable" },
|
|
43
|
+
});
|
|
44
|
+
expect(headers["x-hq-client-machine"]).toBe("ec2-bot-7");
|
|
45
|
+
expect(headers["x-hq-client-channel"]).toBe("stable");
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("clientInfoFromPackage", () => {
|
|
49
|
+
it("extracts name and version from a parsed package.json", () => {
|
|
50
|
+
expect(clientInfoFromPackage({ name: "foo", version: "1.2.3" })).toEqual({
|
|
51
|
+
name: "foo",
|
|
52
|
+
version: "1.2.3",
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it("throws when name is missing", () => {
|
|
56
|
+
expect(() => clientInfoFromPackage({ version: "1.0.0" })).toThrow(/name/);
|
|
57
|
+
});
|
|
58
|
+
it("throws when version is missing", () => {
|
|
59
|
+
expect(() => clientInfoFromPackage({ name: "foo" })).toThrow(/version/);
|
|
60
|
+
});
|
|
61
|
+
it("throws on non-string fields", () => {
|
|
62
|
+
expect(() => clientInfoFromPackage({ name: 42, version: "1.0.0" })).toThrow();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("detectHqCoreVersion", () => {
|
|
66
|
+
let tmpRoot;
|
|
67
|
+
const origHqHome = process.env.HQ_HOME;
|
|
68
|
+
const origHqRoot = process.env.HQ_ROOT;
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
tmpRoot = mkdtempSync(join(tmpdir(), "hq-core-detect-"));
|
|
71
|
+
delete process.env.HQ_HOME;
|
|
72
|
+
delete process.env.HQ_ROOT;
|
|
73
|
+
});
|
|
74
|
+
afterEach(() => {
|
|
75
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
76
|
+
if (origHqHome !== undefined)
|
|
77
|
+
process.env.HQ_HOME = origHqHome;
|
|
78
|
+
if (origHqRoot !== undefined)
|
|
79
|
+
process.env.HQ_ROOT = origHqRoot;
|
|
80
|
+
});
|
|
81
|
+
function seedHqCore(root, version) {
|
|
82
|
+
mkdirSync(join(root, "core"), { recursive: true });
|
|
83
|
+
mkdirSync(join(root, "companies"), { recursive: true });
|
|
84
|
+
writeFileSync(join(root, "core", "core.yaml"), `version: 1\nhqVersion: "${version}"\nupdatedAt: "2026-05-13T00:00:00Z"\n`);
|
|
85
|
+
}
|
|
86
|
+
it("returns undefined when nothing on the walk-up has core.yaml", () => {
|
|
87
|
+
expect(detectHqCoreVersion(tmpRoot)).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
it("returns hqVersion when startDir is the hq-core root", () => {
|
|
90
|
+
seedHqCore(tmpRoot, "14.1.0");
|
|
91
|
+
expect(detectHqCoreVersion(tmpRoot)).toBe("14.1.0");
|
|
92
|
+
});
|
|
93
|
+
it("walks upward to find core.yaml from a nested cwd", () => {
|
|
94
|
+
seedHqCore(tmpRoot, "14.2.0");
|
|
95
|
+
const nested = join(tmpRoot, "companies", "acme", "projects", "p1");
|
|
96
|
+
mkdirSync(nested, { recursive: true });
|
|
97
|
+
expect(detectHqCoreVersion(nested)).toBe("14.2.0");
|
|
98
|
+
});
|
|
99
|
+
it("ignores directories that have core.yaml but no companies/ — disambiguates fixtures", () => {
|
|
100
|
+
mkdirSync(join(tmpRoot, "core"), { recursive: true });
|
|
101
|
+
writeFileSync(join(tmpRoot, "core", "core.yaml"), `version: 1\nhqVersion: "99.0.0"\n`);
|
|
102
|
+
// No companies/ at this level → not an hq-core root.
|
|
103
|
+
expect(detectHqCoreVersion(tmpRoot)).toBeUndefined();
|
|
104
|
+
});
|
|
105
|
+
it("honors HQ_HOME env override before walking cwd", () => {
|
|
106
|
+
seedHqCore(tmpRoot, "14.3.0");
|
|
107
|
+
process.env.HQ_HOME = tmpRoot;
|
|
108
|
+
// startDir intentionally points elsewhere — env should win.
|
|
109
|
+
const elsewhere = mkdtempSync(join(tmpdir(), "elsewhere-"));
|
|
110
|
+
try {
|
|
111
|
+
expect(detectHqCoreVersion(elsewhere)).toBe("14.3.0");
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
rmSync(elsewhere, { recursive: true, force: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it("parses unquoted hqVersion values too", () => {
|
|
118
|
+
mkdirSync(join(tmpRoot, "core"), { recursive: true });
|
|
119
|
+
mkdirSync(join(tmpRoot, "companies"), { recursive: true });
|
|
120
|
+
writeFileSync(join(tmpRoot, "core", "core.yaml"), `version: 1\nhqVersion: 14.4.0\n`);
|
|
121
|
+
expect(detectHqCoreVersion(tmpRoot)).toBe("14.4.0");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("VaultClient stamps client headers on outbound requests", () => {
|
|
125
|
+
afterEach(() => {
|
|
126
|
+
vi.restoreAllMocks();
|
|
127
|
+
});
|
|
128
|
+
it("includes x-hq-client-name + x-hq-client-version when clientInfo is set", async () => {
|
|
129
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({ memberships: [] }), {
|
|
130
|
+
status: 200,
|
|
131
|
+
headers: { "Content-Type": "application/json" },
|
|
132
|
+
}));
|
|
133
|
+
const client = new VaultClient({
|
|
134
|
+
apiUrl: "https://vault.test.example.com",
|
|
135
|
+
authToken: "tok",
|
|
136
|
+
clientInfo: {
|
|
137
|
+
name: "@indigoai-us/hq-cli",
|
|
138
|
+
version: "5.15.0",
|
|
139
|
+
hqCoreVersion: "14.1.0",
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
await client.listMyMemberships();
|
|
143
|
+
expect(fetchSpy).toHaveBeenCalledOnce();
|
|
144
|
+
const init = fetchSpy.mock.calls[0]?.[1];
|
|
145
|
+
const headers = init.headers;
|
|
146
|
+
expect(headers[HEADER_CLIENT_NAME]).toBe("@indigoai-us/hq-cli");
|
|
147
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBe("5.15.0");
|
|
148
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBe("14.1.0");
|
|
149
|
+
expect(headers["User-Agent"]).toBe("@indigoai-us/hq-cli/5.15.0");
|
|
150
|
+
});
|
|
151
|
+
it("omits client headers when clientInfo is not set — back-compat", async () => {
|
|
152
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response(JSON.stringify({ memberships: [] }), {
|
|
153
|
+
status: 200,
|
|
154
|
+
headers: { "Content-Type": "application/json" },
|
|
155
|
+
}));
|
|
156
|
+
const client = new VaultClient({
|
|
157
|
+
apiUrl: "https://vault.test.example.com",
|
|
158
|
+
authToken: "tok",
|
|
159
|
+
});
|
|
160
|
+
await client.listMyMemberships();
|
|
161
|
+
const headers = (fetchSpy.mock.calls[0]?.[1])
|
|
162
|
+
.headers;
|
|
163
|
+
expect(headers[HEADER_CLIENT_NAME]).toBeUndefined();
|
|
164
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBeUndefined();
|
|
165
|
+
expect(headers["User-Agent"]).toBeUndefined();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=client-info.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-info.test.js","sourceRoot":"","sources":["../src/client-info.test.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA2DpE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,2BAA4B,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,CAsExB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
package/dist/context.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* and returns an EntityContext for S3 operations. Handles auto-refresh when
|
|
6
6
|
* credentials are within 2 minutes of expiry.
|
|
7
7
|
*/
|
|
8
|
+
import { buildClientHeaders } from "./client-info.js";
|
|
8
9
|
/** Minimum remaining TTL before auto-refresh triggers (2 minutes). */
|
|
9
10
|
const REFRESH_THRESHOLD_MS = 2 * 60 * 1000;
|
|
10
11
|
/** STS session duration requested from vault-service (15 minutes). */
|
|
@@ -176,7 +177,10 @@ async function resolveAuthToken(config) {
|
|
|
176
177
|
}
|
|
177
178
|
async function fetchEntity(uid, config) {
|
|
178
179
|
const res = await fetch(`${config.apiUrl}/entity/${uid}`, {
|
|
179
|
-
headers: {
|
|
180
|
+
headers: {
|
|
181
|
+
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
182
|
+
...buildClientHeaders(config.clientInfo),
|
|
183
|
+
},
|
|
180
184
|
});
|
|
181
185
|
if (!res.ok) {
|
|
182
186
|
const body = await res.text();
|
|
@@ -195,7 +199,10 @@ async function fetchEntityBySlug(type, slug, config) {
|
|
|
195
199
|
// sync runner's "I want MY company" intent.
|
|
196
200
|
const checkUrl = `${config.apiUrl}/entity/check-slug/me?type=${encodeURIComponent(type)}&slug=${encodeURIComponent(slug)}`;
|
|
197
201
|
const checkRes = await fetch(checkUrl, {
|
|
198
|
-
headers: {
|
|
202
|
+
headers: {
|
|
203
|
+
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
204
|
+
...buildClientHeaders(config.clientInfo),
|
|
205
|
+
},
|
|
199
206
|
});
|
|
200
207
|
if (!checkRes.ok) {
|
|
201
208
|
const body = await checkRes.text();
|
|
@@ -218,6 +225,7 @@ async function postVend(route, body, config) {
|
|
|
218
225
|
headers: {
|
|
219
226
|
"Content-Type": "application/json",
|
|
220
227
|
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
228
|
+
...buildClientHeaders(config.clientInfo),
|
|
221
229
|
},
|
|
222
230
|
body: JSON.stringify({ ...body, durationSeconds: DEFAULT_SESSION_DURATION_SECONDS }),
|
|
223
231
|
});
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,5 +26,6 @@ export { accept, parseToken } from "./cli/index.js";
|
|
|
26
26
|
export type { AcceptOptions, AcceptResult } from "./cli/index.js";
|
|
27
27
|
export { promote } from "./cli/index.js";
|
|
28
28
|
export type { PromoteOptions, PromoteResult } from "./cli/index.js";
|
|
29
|
-
export type { EntityContext, VaultCredentials, VaultServiceConfig, SyncConfig, Credentials, JournalEntry, SyncJournal, SyncStatus, PushResult, PullResult, DaemonState, } from "./types.js";
|
|
29
|
+
export type { EntityContext, VaultCredentials, VaultServiceConfig, ClientInfo, SyncConfig, Credentials, JournalEntry, SyncJournal, SyncStatus, PushResult, PullResult, DaemonState, } from "./types.js";
|
|
30
|
+
export { buildClientHeaders, clientInfoFromPackage, detectHqCoreVersion, HEADER_CLIENT_NAME, HEADER_CLIENT_VERSION, HEADER_HQ_CORE_VERSION, } from "./client-info.js";
|
|
30
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EACL,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EACL,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,4 +22,7 @@ export { resolveConflict, showDiff } from "./cli/index.js";
|
|
|
22
22
|
export { invite, listInvites, revokeInvite } from "./cli/index.js";
|
|
23
23
|
export { accept, parseToken } from "./cli/index.js";
|
|
24
24
|
export { promote } from "./cli/index.js";
|
|
25
|
+
// Client identification — every first-party caller should construct one of
|
|
26
|
+
// these once at startup and pass it in via VaultServiceConfig.clientInfo.
|
|
27
|
+
export { buildClientHeaders, clientInfoFromPackage, detectHqCoreVersion, HEADER_CLIENT_NAME, HEADER_CLIENT_VERSION, HEADER_HQ_CORE_VERSION, } from "./client-info.js";
|
|
25
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,gCAAgC;AAChC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,6EAA6E;AAC7E,OAAO,EACL,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAwB3B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG3D,kCAAkC;AAClC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,GACf,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,gCAAgC;AAChC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,6EAA6E;AAC7E,OAAO,EACL,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAwB3B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG3D,kCAAkC;AAClC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAkBzC,2EAA2E;AAC3E,0EAA0E;AAC1E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -80,6 +80,23 @@ export interface VaultCredentials {
|
|
|
80
80
|
secretAccessKey: string;
|
|
81
81
|
sessionToken: string;
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Caller identification stamped on every request to hq-cloud-api so the server
|
|
85
|
+
* can attribute traffic and gate on minimum versions.
|
|
86
|
+
*/
|
|
87
|
+
export interface ClientInfo {
|
|
88
|
+
/** Package name, e.g. "@indigoai-us/hq-cli" */
|
|
89
|
+
name: string;
|
|
90
|
+
/** Package version, e.g. "5.15.0" */
|
|
91
|
+
version: string;
|
|
92
|
+
/**
|
|
93
|
+
* `hqVersion` from `core/core.yaml` — set when the caller is running inside
|
|
94
|
+
* an hq-core checkout. Lets the server see scaffold-generation skew.
|
|
95
|
+
*/
|
|
96
|
+
hqCoreVersion?: string;
|
|
97
|
+
/** Arbitrary extra key/value pairs forwarded as `x-hq-client-<key>` headers. */
|
|
98
|
+
extra?: Record<string, string>;
|
|
99
|
+
}
|
|
83
100
|
/**
|
|
84
101
|
* Configuration for connecting to the vault-service API.
|
|
85
102
|
*/
|
|
@@ -99,6 +116,11 @@ export interface VaultServiceConfig {
|
|
|
99
116
|
authToken: string | (() => string | Promise<string>);
|
|
100
117
|
/** AWS region for S3 client (defaults to entity region or us-east-1) */
|
|
101
118
|
region?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Identifies the calling package + version on every outbound request.
|
|
121
|
+
* Optional for back-compat, but all first-party clients should pass it.
|
|
122
|
+
*/
|
|
123
|
+
clientInfo?: ClientInfo;
|
|
102
124
|
}
|
|
103
125
|
export interface ConflictIndexEntry {
|
|
104
126
|
id: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/vault-client.d.ts
CHANGED
|
@@ -129,6 +129,7 @@ export interface VendChildResult {
|
|
|
129
129
|
export declare class VaultClient {
|
|
130
130
|
private readonly apiUrl;
|
|
131
131
|
private readonly getAuthToken;
|
|
132
|
+
private readonly clientInfo;
|
|
132
133
|
constructor(config: VaultServiceConfig);
|
|
133
134
|
createInvite(input: CreateInviteInput): Promise<CreateInviteResult>;
|
|
134
135
|
acceptInvite(token: string, personUid: string): Promise<AcceptInviteResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
|
package/dist/vault-client.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Colocated with hq-cloud so /invite, /promote, /accept and future commands
|
|
6
6
|
* share one client instead of each rolling its own HTTP layer.
|
|
7
7
|
*/
|
|
8
|
+
import { buildClientHeaders } from "./client-info.js";
|
|
8
9
|
// ---------------------------------------------------------------------------
|
|
9
10
|
// Error classes
|
|
10
11
|
// ---------------------------------------------------------------------------
|
|
@@ -75,6 +76,7 @@ async function sleep(ms) {
|
|
|
75
76
|
export class VaultClient {
|
|
76
77
|
apiUrl;
|
|
77
78
|
getAuthToken;
|
|
79
|
+
clientInfo;
|
|
78
80
|
constructor(config) {
|
|
79
81
|
this.apiUrl = config.apiUrl.replace(/\/+$/, "");
|
|
80
82
|
// Normalize string|getter into a single async getter so the request path
|
|
@@ -88,6 +90,7 @@ export class VaultClient {
|
|
|
88
90
|
typeof tok === "function"
|
|
89
91
|
? async () => tok()
|
|
90
92
|
: async () => tok;
|
|
93
|
+
this.clientInfo = config.clientInfo;
|
|
91
94
|
}
|
|
92
95
|
// -- Membership operations ------------------------------------------------
|
|
93
96
|
async createInvite(input) {
|
|
@@ -281,6 +284,7 @@ export class VaultClient {
|
|
|
281
284
|
const headers = {
|
|
282
285
|
Authorization: `Bearer ${await this.getAuthToken()}`,
|
|
283
286
|
Accept: "application/json",
|
|
287
|
+
...buildClientHeaders(this.clientInfo),
|
|
284
288
|
};
|
|
285
289
|
const init = { method, headers };
|
|
286
290
|
if (body !== undefined) {
|
package/dist/vault-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the client-info helpers and header injection.
|
|
3
|
+
*
|
|
4
|
+
* Two layers are exercised here:
|
|
5
|
+
* 1. The pure functions in `client-info.ts` — buildClientHeaders,
|
|
6
|
+
* clientInfoFromPackage, detectHqCoreVersion.
|
|
7
|
+
* 2. End-to-end injection into VaultClient.request, since "the headers
|
|
8
|
+
* actually land on outbound fetch" is the property consumers care about.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
12
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import {
|
|
16
|
+
buildClientHeaders,
|
|
17
|
+
clientInfoFromPackage,
|
|
18
|
+
detectHqCoreVersion,
|
|
19
|
+
HEADER_CLIENT_NAME,
|
|
20
|
+
HEADER_CLIENT_VERSION,
|
|
21
|
+
HEADER_HQ_CORE_VERSION,
|
|
22
|
+
} from "./client-info.js";
|
|
23
|
+
import { VaultClient } from "./vault-client.js";
|
|
24
|
+
|
|
25
|
+
describe("buildClientHeaders", () => {
|
|
26
|
+
it("returns empty object when info is undefined", () => {
|
|
27
|
+
expect(buildClientHeaders(undefined)).toEqual({});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("emits User-Agent + x-hq-client-{name,version} from name/version", () => {
|
|
31
|
+
const headers = buildClientHeaders({
|
|
32
|
+
name: "@indigoai-us/hq-cli",
|
|
33
|
+
version: "5.15.0",
|
|
34
|
+
});
|
|
35
|
+
expect(headers["User-Agent"]).toBe("@indigoai-us/hq-cli/5.15.0");
|
|
36
|
+
expect(headers[HEADER_CLIENT_NAME]).toBe("@indigoai-us/hq-cli");
|
|
37
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBe("5.15.0");
|
|
38
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("includes x-hq-core-version only when hqCoreVersion is set", () => {
|
|
42
|
+
const headers = buildClientHeaders({
|
|
43
|
+
name: "@indigoai-us/hq-cli",
|
|
44
|
+
version: "5.15.0",
|
|
45
|
+
hqCoreVersion: "14.1.0",
|
|
46
|
+
});
|
|
47
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBe("14.1.0");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("emits arbitrary extra fields as x-hq-client-<key> headers", () => {
|
|
51
|
+
const headers = buildClientHeaders({
|
|
52
|
+
name: "x",
|
|
53
|
+
version: "1.0.0",
|
|
54
|
+
extra: { machine: "ec2-bot-7", channel: "stable" },
|
|
55
|
+
});
|
|
56
|
+
expect(headers["x-hq-client-machine"]).toBe("ec2-bot-7");
|
|
57
|
+
expect(headers["x-hq-client-channel"]).toBe("stable");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe("clientInfoFromPackage", () => {
|
|
62
|
+
it("extracts name and version from a parsed package.json", () => {
|
|
63
|
+
expect(clientInfoFromPackage({ name: "foo", version: "1.2.3" })).toEqual({
|
|
64
|
+
name: "foo",
|
|
65
|
+
version: "1.2.3",
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("throws when name is missing", () => {
|
|
70
|
+
expect(() => clientInfoFromPackage({ version: "1.0.0" })).toThrow(/name/);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("throws when version is missing", () => {
|
|
74
|
+
expect(() => clientInfoFromPackage({ name: "foo" })).toThrow(/version/);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("throws on non-string fields", () => {
|
|
78
|
+
expect(() =>
|
|
79
|
+
clientInfoFromPackage({ name: 42 as unknown as string, version: "1.0.0" }),
|
|
80
|
+
).toThrow();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe("detectHqCoreVersion", () => {
|
|
85
|
+
let tmpRoot: string;
|
|
86
|
+
const origHqHome = process.env.HQ_HOME;
|
|
87
|
+
const origHqRoot = process.env.HQ_ROOT;
|
|
88
|
+
|
|
89
|
+
beforeEach(() => {
|
|
90
|
+
tmpRoot = mkdtempSync(join(tmpdir(), "hq-core-detect-"));
|
|
91
|
+
delete process.env.HQ_HOME;
|
|
92
|
+
delete process.env.HQ_ROOT;
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
afterEach(() => {
|
|
96
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
97
|
+
if (origHqHome !== undefined) process.env.HQ_HOME = origHqHome;
|
|
98
|
+
if (origHqRoot !== undefined) process.env.HQ_ROOT = origHqRoot;
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
function seedHqCore(root: string, version: string): void {
|
|
102
|
+
mkdirSync(join(root, "core"), { recursive: true });
|
|
103
|
+
mkdirSync(join(root, "companies"), { recursive: true });
|
|
104
|
+
writeFileSync(
|
|
105
|
+
join(root, "core", "core.yaml"),
|
|
106
|
+
`version: 1\nhqVersion: "${version}"\nupdatedAt: "2026-05-13T00:00:00Z"\n`,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
it("returns undefined when nothing on the walk-up has core.yaml", () => {
|
|
111
|
+
expect(detectHqCoreVersion(tmpRoot)).toBeUndefined();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("returns hqVersion when startDir is the hq-core root", () => {
|
|
115
|
+
seedHqCore(tmpRoot, "14.1.0");
|
|
116
|
+
expect(detectHqCoreVersion(tmpRoot)).toBe("14.1.0");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("walks upward to find core.yaml from a nested cwd", () => {
|
|
120
|
+
seedHqCore(tmpRoot, "14.2.0");
|
|
121
|
+
const nested = join(tmpRoot, "companies", "acme", "projects", "p1");
|
|
122
|
+
mkdirSync(nested, { recursive: true });
|
|
123
|
+
expect(detectHqCoreVersion(nested)).toBe("14.2.0");
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("ignores directories that have core.yaml but no companies/ — disambiguates fixtures", () => {
|
|
127
|
+
mkdirSync(join(tmpRoot, "core"), { recursive: true });
|
|
128
|
+
writeFileSync(
|
|
129
|
+
join(tmpRoot, "core", "core.yaml"),
|
|
130
|
+
`version: 1\nhqVersion: "99.0.0"\n`,
|
|
131
|
+
);
|
|
132
|
+
// No companies/ at this level → not an hq-core root.
|
|
133
|
+
expect(detectHqCoreVersion(tmpRoot)).toBeUndefined();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("honors HQ_HOME env override before walking cwd", () => {
|
|
137
|
+
seedHqCore(tmpRoot, "14.3.0");
|
|
138
|
+
process.env.HQ_HOME = tmpRoot;
|
|
139
|
+
// startDir intentionally points elsewhere — env should win.
|
|
140
|
+
const elsewhere = mkdtempSync(join(tmpdir(), "elsewhere-"));
|
|
141
|
+
try {
|
|
142
|
+
expect(detectHqCoreVersion(elsewhere)).toBe("14.3.0");
|
|
143
|
+
} finally {
|
|
144
|
+
rmSync(elsewhere, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("parses unquoted hqVersion values too", () => {
|
|
149
|
+
mkdirSync(join(tmpRoot, "core"), { recursive: true });
|
|
150
|
+
mkdirSync(join(tmpRoot, "companies"), { recursive: true });
|
|
151
|
+
writeFileSync(
|
|
152
|
+
join(tmpRoot, "core", "core.yaml"),
|
|
153
|
+
`version: 1\nhqVersion: 14.4.0\n`,
|
|
154
|
+
);
|
|
155
|
+
expect(detectHqCoreVersion(tmpRoot)).toBe("14.4.0");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe("VaultClient stamps client headers on outbound requests", () => {
|
|
160
|
+
afterEach(() => {
|
|
161
|
+
vi.restoreAllMocks();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("includes x-hq-client-name + x-hq-client-version when clientInfo is set", async () => {
|
|
165
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue(
|
|
166
|
+
new Response(JSON.stringify({ memberships: [] }), {
|
|
167
|
+
status: 200,
|
|
168
|
+
headers: { "Content-Type": "application/json" },
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
const client = new VaultClient({
|
|
173
|
+
apiUrl: "https://vault.test.example.com",
|
|
174
|
+
authToken: "tok",
|
|
175
|
+
clientInfo: {
|
|
176
|
+
name: "@indigoai-us/hq-cli",
|
|
177
|
+
version: "5.15.0",
|
|
178
|
+
hqCoreVersion: "14.1.0",
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
await client.listMyMemberships();
|
|
183
|
+
|
|
184
|
+
expect(fetchSpy).toHaveBeenCalledOnce();
|
|
185
|
+
const init = fetchSpy.mock.calls[0]?.[1] as RequestInit;
|
|
186
|
+
const headers = init.headers as Record<string, string>;
|
|
187
|
+
expect(headers[HEADER_CLIENT_NAME]).toBe("@indigoai-us/hq-cli");
|
|
188
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBe("5.15.0");
|
|
189
|
+
expect(headers[HEADER_HQ_CORE_VERSION]).toBe("14.1.0");
|
|
190
|
+
expect(headers["User-Agent"]).toBe("@indigoai-us/hq-cli/5.15.0");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("omits client headers when clientInfo is not set — back-compat", async () => {
|
|
194
|
+
const fetchSpy = vi.spyOn(globalThis, "fetch").mockResolvedValue(
|
|
195
|
+
new Response(JSON.stringify({ memberships: [] }), {
|
|
196
|
+
status: 200,
|
|
197
|
+
headers: { "Content-Type": "application/json" },
|
|
198
|
+
}),
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const client = new VaultClient({
|
|
202
|
+
apiUrl: "https://vault.test.example.com",
|
|
203
|
+
authToken: "tok",
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
await client.listMyMemberships();
|
|
207
|
+
|
|
208
|
+
const headers = (fetchSpy.mock.calls[0]?.[1] as RequestInit)
|
|
209
|
+
.headers as Record<string, string>;
|
|
210
|
+
expect(headers[HEADER_CLIENT_NAME]).toBeUndefined();
|
|
211
|
+
expect(headers[HEADER_CLIENT_VERSION]).toBeUndefined();
|
|
212
|
+
expect(headers["User-Agent"]).toBeUndefined();
|
|
213
|
+
});
|
|
214
|
+
});
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client identification — every HQ client that talks to hq-cloud-api should
|
|
3
|
+
* stamp its name and version on outbound requests so the server can attribute
|
|
4
|
+
* traffic, gate on minimum versions, and surface deprecation warnings.
|
|
5
|
+
*
|
|
6
|
+
* The CLI in particular sends a third header (`x-hq-core-version`) when it's
|
|
7
|
+
* invoked from inside an hq-core checkout, so the server sees which scaffold
|
|
8
|
+
* generation the user is running against.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import type { ClientInfo } from "./types.js";
|
|
14
|
+
|
|
15
|
+
export const HEADER_CLIENT_NAME = "x-hq-client-name";
|
|
16
|
+
export const HEADER_CLIENT_VERSION = "x-hq-client-version";
|
|
17
|
+
export const HEADER_HQ_CORE_VERSION = "x-hq-core-version";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Build the set of `x-hq-*` headers (plus a derived `User-Agent`) for a
|
|
21
|
+
* ClientInfo. Returns an empty object when info is undefined so callers can
|
|
22
|
+
* spread the result unconditionally.
|
|
23
|
+
*/
|
|
24
|
+
export function buildClientHeaders(
|
|
25
|
+
info: ClientInfo | undefined,
|
|
26
|
+
): Record<string, string> {
|
|
27
|
+
if (!info) return {};
|
|
28
|
+
|
|
29
|
+
const headers: Record<string, string> = {
|
|
30
|
+
"User-Agent": `${info.name}/${info.version}`,
|
|
31
|
+
[HEADER_CLIENT_NAME]: info.name,
|
|
32
|
+
[HEADER_CLIENT_VERSION]: info.version,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (info.hqCoreVersion) {
|
|
36
|
+
headers[HEADER_HQ_CORE_VERSION] = info.hqCoreVersion;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (info.extra) {
|
|
40
|
+
for (const [k, v] of Object.entries(info.extra)) {
|
|
41
|
+
headers[`x-hq-client-${k}`] = v;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return headers;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Build a ClientInfo from a parsed package.json. Most consumers will call this
|
|
50
|
+
* once at startup and pass the result into every VaultServiceConfig.
|
|
51
|
+
*/
|
|
52
|
+
export function clientInfoFromPackage(pkg: {
|
|
53
|
+
name?: unknown;
|
|
54
|
+
version?: unknown;
|
|
55
|
+
}): ClientInfo {
|
|
56
|
+
if (typeof pkg.name !== "string" || pkg.name.length === 0) {
|
|
57
|
+
throw new Error("clientInfoFromPackage: package.json is missing a name");
|
|
58
|
+
}
|
|
59
|
+
if (typeof pkg.version !== "string" || pkg.version.length === 0) {
|
|
60
|
+
throw new Error("clientInfoFromPackage: package.json is missing a version");
|
|
61
|
+
}
|
|
62
|
+
return { name: pkg.name, version: pkg.version };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Walk upward from `startDir` looking for `core/core.yaml`. When found, parse
|
|
67
|
+
* out the `hqVersion` field and return it. Returns undefined if we never find
|
|
68
|
+
* an hq-core checkout — i.e. the caller is running from a plain user dir.
|
|
69
|
+
*
|
|
70
|
+
* Honors `HQ_HOME` env var as an explicit override so multi-checkout setups
|
|
71
|
+
* (e.g. CI bots, the menubar app pointing at a non-cwd HQ root) can pin the
|
|
72
|
+
* detection without relying on cwd.
|
|
73
|
+
*
|
|
74
|
+
* Why a regex instead of a YAML parser: `core.yaml` lives at the very top of
|
|
75
|
+
* the file and the field has a stable shape — adding a YAML dep just to read
|
|
76
|
+
* one string would balloon every consumer's bundle. The current shape is
|
|
77
|
+
* `hqVersion: "X.Y.Z"` (quoted) per the canonical seed; we tolerate unquoted
|
|
78
|
+
* too.
|
|
79
|
+
*/
|
|
80
|
+
export function detectHqCoreVersion(startDir?: string): string | undefined {
|
|
81
|
+
const fromEnv = process.env.HQ_HOME ?? process.env.HQ_ROOT;
|
|
82
|
+
if (fromEnv) {
|
|
83
|
+
const v = readCoreVersionAt(fromEnv);
|
|
84
|
+
if (v) return v;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let dir = resolve(startDir ?? process.cwd());
|
|
88
|
+
while (true) {
|
|
89
|
+
const v = readCoreVersionAt(dir);
|
|
90
|
+
if (v) return v;
|
|
91
|
+
const parent = dirname(dir);
|
|
92
|
+
if (parent === dir) return undefined;
|
|
93
|
+
dir = parent;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function readCoreVersionAt(hqRoot: string): string | undefined {
|
|
98
|
+
// hq-core identity requires BOTH core/core.yaml AND companies/ — matches the
|
|
99
|
+
// CLI's own detection (commit bc827d0). Without this guard, any directory
|
|
100
|
+
// containing a stray `core/core.yaml` (e.g. a test fixture) would be
|
|
101
|
+
// misidentified as an hq-core root.
|
|
102
|
+
const yamlPath = join(hqRoot, "core", "core.yaml");
|
|
103
|
+
const companiesPath = join(hqRoot, "companies");
|
|
104
|
+
let content: string;
|
|
105
|
+
try {
|
|
106
|
+
content = readFileSync(yamlPath, "utf8");
|
|
107
|
+
} catch {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
// statSync would be marginally cleaner, but readdirSync of a nonexistent
|
|
112
|
+
// path throws synchronously which is what we want.
|
|
113
|
+
readFileSync(companiesPath, { flag: "r" });
|
|
114
|
+
} catch (err) {
|
|
115
|
+
const e = err as NodeJS.ErrnoException;
|
|
116
|
+
// EISDIR is the success case — companies/ exists and is a directory.
|
|
117
|
+
if (e.code !== "EISDIR") return undefined;
|
|
118
|
+
}
|
|
119
|
+
const match = /^hqVersion:\s*["']?([^"'\s]+)/m.exec(content);
|
|
120
|
+
return match ? match[1] : undefined;
|
|
121
|
+
}
|
package/src/context.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { EntityContext, VaultServiceConfig } from "./types.js";
|
|
10
|
+
import { buildClientHeaders } from "./client-info.js";
|
|
10
11
|
|
|
11
12
|
/** Minimum remaining TTL before auto-refresh triggers (2 minutes). */
|
|
12
13
|
const REFRESH_THRESHOLD_MS = 2 * 60 * 1000;
|
|
@@ -231,7 +232,10 @@ async function fetchEntity(
|
|
|
231
232
|
config: VaultServiceConfig,
|
|
232
233
|
): Promise<EntityResponse> {
|
|
233
234
|
const res = await fetch(`${config.apiUrl}/entity/${uid}`, {
|
|
234
|
-
headers: {
|
|
235
|
+
headers: {
|
|
236
|
+
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
237
|
+
...buildClientHeaders(config.clientInfo),
|
|
238
|
+
},
|
|
235
239
|
});
|
|
236
240
|
if (!res.ok) {
|
|
237
241
|
const body = await res.text();
|
|
@@ -255,7 +259,10 @@ async function fetchEntityBySlug(
|
|
|
255
259
|
// sync runner's "I want MY company" intent.
|
|
256
260
|
const checkUrl = `${config.apiUrl}/entity/check-slug/me?type=${encodeURIComponent(type)}&slug=${encodeURIComponent(slug)}`;
|
|
257
261
|
const checkRes = await fetch(checkUrl, {
|
|
258
|
-
headers: {
|
|
262
|
+
headers: {
|
|
263
|
+
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
264
|
+
...buildClientHeaders(config.clientInfo),
|
|
265
|
+
},
|
|
259
266
|
});
|
|
260
267
|
if (!checkRes.ok) {
|
|
261
268
|
const body = await checkRes.text();
|
|
@@ -290,6 +297,7 @@ async function postVend(
|
|
|
290
297
|
headers: {
|
|
291
298
|
"Content-Type": "application/json",
|
|
292
299
|
Authorization: `Bearer ${await resolveAuthToken(config)}`,
|
|
300
|
+
...buildClientHeaders(config.clientInfo),
|
|
293
301
|
},
|
|
294
302
|
body: JSON.stringify({ ...body, durationSeconds: DEFAULT_SESSION_DURATION_SECONDS }),
|
|
295
303
|
});
|
package/src/index.ts
CHANGED
|
@@ -106,6 +106,7 @@ export type {
|
|
|
106
106
|
EntityContext,
|
|
107
107
|
VaultCredentials,
|
|
108
108
|
VaultServiceConfig,
|
|
109
|
+
ClientInfo,
|
|
109
110
|
SyncConfig,
|
|
110
111
|
Credentials,
|
|
111
112
|
JournalEntry,
|
|
@@ -115,3 +116,14 @@ export type {
|
|
|
115
116
|
PullResult,
|
|
116
117
|
DaemonState,
|
|
117
118
|
} from "./types.js";
|
|
119
|
+
|
|
120
|
+
// Client identification — every first-party caller should construct one of
|
|
121
|
+
// these once at startup and pass it in via VaultServiceConfig.clientInfo.
|
|
122
|
+
export {
|
|
123
|
+
buildClientHeaders,
|
|
124
|
+
clientInfoFromPackage,
|
|
125
|
+
detectHqCoreVersion,
|
|
126
|
+
HEADER_CLIENT_NAME,
|
|
127
|
+
HEADER_CLIENT_VERSION,
|
|
128
|
+
HEADER_HQ_CORE_VERSION,
|
|
129
|
+
} from "./client-info.js";
|
package/src/types.ts
CHANGED
|
@@ -91,6 +91,24 @@ export interface VaultCredentials {
|
|
|
91
91
|
sessionToken: string;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Caller identification stamped on every request to hq-cloud-api so the server
|
|
96
|
+
* can attribute traffic and gate on minimum versions.
|
|
97
|
+
*/
|
|
98
|
+
export interface ClientInfo {
|
|
99
|
+
/** Package name, e.g. "@indigoai-us/hq-cli" */
|
|
100
|
+
name: string;
|
|
101
|
+
/** Package version, e.g. "5.15.0" */
|
|
102
|
+
version: string;
|
|
103
|
+
/**
|
|
104
|
+
* `hqVersion` from `core/core.yaml` — set when the caller is running inside
|
|
105
|
+
* an hq-core checkout. Lets the server see scaffold-generation skew.
|
|
106
|
+
*/
|
|
107
|
+
hqCoreVersion?: string;
|
|
108
|
+
/** Arbitrary extra key/value pairs forwarded as `x-hq-client-<key>` headers. */
|
|
109
|
+
extra?: Record<string, string>;
|
|
110
|
+
}
|
|
111
|
+
|
|
94
112
|
/**
|
|
95
113
|
* Configuration for connecting to the vault-service API.
|
|
96
114
|
*/
|
|
@@ -110,6 +128,11 @@ export interface VaultServiceConfig {
|
|
|
110
128
|
authToken: string | (() => string | Promise<string>);
|
|
111
129
|
/** AWS region for S3 client (defaults to entity region or us-east-1) */
|
|
112
130
|
region?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Identifies the calling package + version on every outbound request.
|
|
133
|
+
* Optional for back-compat, but all first-party clients should pass it.
|
|
134
|
+
*/
|
|
135
|
+
clientInfo?: ClientInfo;
|
|
113
136
|
}
|
|
114
137
|
|
|
115
138
|
// ── Conflict index (consumed by /resolve-conflicts) ─────────────────────────
|
package/src/vault-client.ts
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* share one client instead of each rolling its own HTTP layer.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import type { VaultServiceConfig } from "./types.js";
|
|
9
|
+
import type { ClientInfo, VaultServiceConfig } from "./types.js";
|
|
10
|
+
import { buildClientHeaders } from "./client-info.js";
|
|
10
11
|
|
|
11
12
|
// ---------------------------------------------------------------------------
|
|
12
13
|
// Error classes
|
|
@@ -213,6 +214,7 @@ async function sleep(ms: number): Promise<void> {
|
|
|
213
214
|
export class VaultClient {
|
|
214
215
|
private readonly apiUrl: string;
|
|
215
216
|
private readonly getAuthToken: () => Promise<string>;
|
|
217
|
+
private readonly clientInfo: ClientInfo | undefined;
|
|
216
218
|
|
|
217
219
|
constructor(config: VaultServiceConfig) {
|
|
218
220
|
this.apiUrl = config.apiUrl.replace(/\/+$/, "");
|
|
@@ -227,6 +229,7 @@ export class VaultClient {
|
|
|
227
229
|
typeof tok === "function"
|
|
228
230
|
? async () => tok()
|
|
229
231
|
: async () => tok;
|
|
232
|
+
this.clientInfo = config.clientInfo;
|
|
230
233
|
}
|
|
231
234
|
|
|
232
235
|
// -- Membership operations ------------------------------------------------
|
|
@@ -485,6 +488,7 @@ export class VaultClient {
|
|
|
485
488
|
const headers: Record<string, string> = {
|
|
486
489
|
Authorization: `Bearer ${await this.getAuthToken()}`,
|
|
487
490
|
Accept: "application/json",
|
|
491
|
+
...buildClientHeaders(this.clientInfo),
|
|
488
492
|
};
|
|
489
493
|
|
|
490
494
|
const init: RequestInit = { method, headers };
|