@provenonce/partner 1.0.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.
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @provenonce/partner — Provenonce Partner SDK
3
+ *
4
+ * For skill developers. Wraps GET /api/v1/sigil/check so any skill can verify
5
+ * an agent's SIGIL and get a signup URL in one call.
6
+ *
7
+ * Usage (server-side only — partner key must never be in a client bundle):
8
+ *
9
+ * import { checkSigil } from '@provenonce/partner'
10
+ *
11
+ * const result = await checkSigil({
12
+ * agentHash: '0x1234...',
13
+ * partnerKey: process.env.PROVENONCE_PARTNER_KEY!,
14
+ * })
15
+ *
16
+ * if (!result.valid) {
17
+ * return redirect(result.signupUrl)
18
+ * }
19
+ */
20
+ interface SigilCheckOptions {
21
+ /** Agent hash to check (0x-prefixed 64-char hex) */
22
+ agentHash: string;
23
+ /** Your pvp_ partner key — server-side only, never expose to clients */
24
+ partnerKey: string;
25
+ /** Base URL override (default: https://provenonce.io) */
26
+ baseUrl?: string;
27
+ /** Request timeout in ms (default: 5000) */
28
+ timeoutMs?: number;
29
+ }
30
+ /** Agent has a valid SIGIL */
31
+ interface SigilCheckValid {
32
+ valid: true;
33
+ sigil: string;
34
+ identityClass: string;
35
+ tier: string;
36
+ }
37
+ /** Agent has no SIGIL (or is inactive) — signupUrl is pre-built with your ref token */
38
+ interface SigilCheckInvalid {
39
+ valid: false;
40
+ reason: 'no_sigil' | 'inactive' | 'not_registered';
41
+ /** Pre-built signup URL with your ref token embedded. Redirect the user here. */
42
+ signupUrl: string | null;
43
+ }
44
+ type SigilCheckResult = SigilCheckValid | SigilCheckInvalid;
45
+ /**
46
+ * Check whether an agent has a valid SIGIL.
47
+ *
48
+ * Server-side only. The `partnerKey` (pvp_...) must never be sent to clients.
49
+ *
50
+ * On success: returns { valid: true, sigil, identityClass, tier }
51
+ * On no SIGIL: returns { valid: false, reason, signupUrl } — redirect to signupUrl
52
+ * On auth error: throws ProvenoncePartnerError with status 401/403
53
+ * On rate limit: throws ProvenoncePartnerError with status 429
54
+ */
55
+ declare function checkSigil(opts: SigilCheckOptions): Promise<SigilCheckResult>;
56
+ declare class ProvenoncePartnerError extends Error {
57
+ readonly status: number;
58
+ constructor(message: string, status: number);
59
+ }
60
+
61
+ export { ProvenoncePartnerError, type SigilCheckInvalid, type SigilCheckOptions, type SigilCheckResult, type SigilCheckValid, checkSigil };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @provenonce/partner — Provenonce Partner SDK
3
+ *
4
+ * For skill developers. Wraps GET /api/v1/sigil/check so any skill can verify
5
+ * an agent's SIGIL and get a signup URL in one call.
6
+ *
7
+ * Usage (server-side only — partner key must never be in a client bundle):
8
+ *
9
+ * import { checkSigil } from '@provenonce/partner'
10
+ *
11
+ * const result = await checkSigil({
12
+ * agentHash: '0x1234...',
13
+ * partnerKey: process.env.PROVENONCE_PARTNER_KEY!,
14
+ * })
15
+ *
16
+ * if (!result.valid) {
17
+ * return redirect(result.signupUrl)
18
+ * }
19
+ */
20
+ interface SigilCheckOptions {
21
+ /** Agent hash to check (0x-prefixed 64-char hex) */
22
+ agentHash: string;
23
+ /** Your pvp_ partner key — server-side only, never expose to clients */
24
+ partnerKey: string;
25
+ /** Base URL override (default: https://provenonce.io) */
26
+ baseUrl?: string;
27
+ /** Request timeout in ms (default: 5000) */
28
+ timeoutMs?: number;
29
+ }
30
+ /** Agent has a valid SIGIL */
31
+ interface SigilCheckValid {
32
+ valid: true;
33
+ sigil: string;
34
+ identityClass: string;
35
+ tier: string;
36
+ }
37
+ /** Agent has no SIGIL (or is inactive) — signupUrl is pre-built with your ref token */
38
+ interface SigilCheckInvalid {
39
+ valid: false;
40
+ reason: 'no_sigil' | 'inactive' | 'not_registered';
41
+ /** Pre-built signup URL with your ref token embedded. Redirect the user here. */
42
+ signupUrl: string | null;
43
+ }
44
+ type SigilCheckResult = SigilCheckValid | SigilCheckInvalid;
45
+ /**
46
+ * Check whether an agent has a valid SIGIL.
47
+ *
48
+ * Server-side only. The `partnerKey` (pvp_...) must never be sent to clients.
49
+ *
50
+ * On success: returns { valid: true, sigil, identityClass, tier }
51
+ * On no SIGIL: returns { valid: false, reason, signupUrl } — redirect to signupUrl
52
+ * On auth error: throws ProvenoncePartnerError with status 401/403
53
+ * On rate limit: throws ProvenoncePartnerError with status 429
54
+ */
55
+ declare function checkSigil(opts: SigilCheckOptions): Promise<SigilCheckResult>;
56
+ declare class ProvenoncePartnerError extends Error {
57
+ readonly status: number;
58
+ constructor(message: string, status: number);
59
+ }
60
+
61
+ export { ProvenoncePartnerError, type SigilCheckInvalid, type SigilCheckOptions, type SigilCheckResult, type SigilCheckValid, checkSigil };
package/dist/index.js ADDED
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ProvenoncePartnerError: () => ProvenoncePartnerError,
24
+ checkSigil: () => checkSigil
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+ var DEFAULT_BASE_URL = "https://provenonce.io";
28
+ var DEFAULT_TIMEOUT_MS = 5e3;
29
+ async function checkSigil(opts) {
30
+ const { agentHash, partnerKey, baseUrl = DEFAULT_BASE_URL, timeoutMs = DEFAULT_TIMEOUT_MS } = opts;
31
+ if (!agentHash) throw new ProvenoncePartnerError("agentHash is required", 400);
32
+ if (!partnerKey?.startsWith("pvp_")) {
33
+ throw new ProvenoncePartnerError("partnerKey must start with pvp_", 400);
34
+ }
35
+ const url = `${baseUrl.replace(/\/$/, "")}/api/v1/sigil/check?hash=${encodeURIComponent(agentHash)}`;
36
+ const controller = new AbortController();
37
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
38
+ let res;
39
+ try {
40
+ res = await fetch(url, {
41
+ headers: { Authorization: `Bearer ${partnerKey}` },
42
+ signal: controller.signal
43
+ });
44
+ } catch (err) {
45
+ clearTimeout(timer);
46
+ if (err?.name === "AbortError") {
47
+ throw new ProvenoncePartnerError(`Request timed out after ${timeoutMs}ms`, 408);
48
+ }
49
+ throw new ProvenoncePartnerError(`Network error: ${err?.message ?? err}`, 0);
50
+ } finally {
51
+ clearTimeout(timer);
52
+ }
53
+ if (res.status === 401 || res.status === 403) {
54
+ const body = await res.json().catch(() => ({}));
55
+ throw new ProvenoncePartnerError(
56
+ body?.error ?? "Partner key rejected",
57
+ res.status
58
+ );
59
+ }
60
+ if (res.status === 429) {
61
+ throw new ProvenoncePartnerError("Rate limit exceeded", 429);
62
+ }
63
+ if (!res.ok) {
64
+ throw new ProvenoncePartnerError(`Unexpected response: ${res.status}`, res.status);
65
+ }
66
+ const data = await res.json();
67
+ if (data.valid === true) {
68
+ return {
69
+ valid: true,
70
+ sigil: data.sigil ?? "",
71
+ identityClass: data.identity_class ?? "",
72
+ tier: data.tier ?? ""
73
+ };
74
+ }
75
+ return {
76
+ valid: false,
77
+ reason: data.reason ?? "no_sigil",
78
+ signupUrl: data.signup_url ?? null
79
+ };
80
+ }
81
+ var ProvenoncePartnerError = class extends Error {
82
+ constructor(message, status) {
83
+ super(message);
84
+ this.name = "ProvenoncePartnerError";
85
+ this.status = status;
86
+ Object.setPrototypeOf(this, new.target.prototype);
87
+ }
88
+ };
89
+ // Annotate the CommonJS export names for ESM import in node:
90
+ 0 && (module.exports = {
91
+ ProvenoncePartnerError,
92
+ checkSigil
93
+ });
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * @provenonce/partner — Provenonce Partner SDK\r\n *\r\n * For skill developers. Wraps GET /api/v1/sigil/check so any skill can verify\r\n * an agent's SIGIL and get a signup URL in one call.\r\n *\r\n * Usage (server-side only — partner key must never be in a client bundle):\r\n *\r\n * import { checkSigil } from '@provenonce/partner'\r\n *\r\n * const result = await checkSigil({\r\n * agentHash: '0x1234...',\r\n * partnerKey: process.env.PROVENONCE_PARTNER_KEY!,\r\n * })\r\n *\r\n * if (!result.valid) {\r\n * return redirect(result.signupUrl)\r\n * }\r\n */\r\n\r\nconst DEFAULT_BASE_URL = 'https://provenonce.io';\r\nconst DEFAULT_TIMEOUT_MS = 5_000;\r\n\r\n// ── Types ─────────────────────────────────────────────────────────────────────\r\n\r\nexport interface SigilCheckOptions {\r\n /** Agent hash to check (0x-prefixed 64-char hex) */\r\n agentHash: string;\r\n /** Your pvp_ partner key — server-side only, never expose to clients */\r\n partnerKey: string;\r\n /** Base URL override (default: https://provenonce.io) */\r\n baseUrl?: string;\r\n /** Request timeout in ms (default: 5000) */\r\n timeoutMs?: number;\r\n}\r\n\r\n/** Agent has a valid SIGIL */\r\nexport interface SigilCheckValid {\r\n valid: true;\r\n sigil: string;\r\n identityClass: string;\r\n tier: string;\r\n}\r\n\r\n/** Agent has no SIGIL (or is inactive) — signupUrl is pre-built with your ref token */\r\nexport interface SigilCheckInvalid {\r\n valid: false;\r\n reason: 'no_sigil' | 'inactive' | 'not_registered';\r\n /** Pre-built signup URL with your ref token embedded. Redirect the user here. */\r\n signupUrl: string | null;\r\n}\r\n\r\nexport type SigilCheckResult = SigilCheckValid | SigilCheckInvalid;\r\n\r\n// ── Main function ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Check whether an agent has a valid SIGIL.\r\n *\r\n * Server-side only. The `partnerKey` (pvp_...) must never be sent to clients.\r\n *\r\n * On success: returns { valid: true, sigil, identityClass, tier }\r\n * On no SIGIL: returns { valid: false, reason, signupUrl } — redirect to signupUrl\r\n * On auth error: throws ProvenoncePartnerError with status 401/403\r\n * On rate limit: throws ProvenoncePartnerError with status 429\r\n */\r\nexport async function checkSigil(opts: SigilCheckOptions): Promise<SigilCheckResult> {\r\n const { agentHash, partnerKey, baseUrl = DEFAULT_BASE_URL, timeoutMs = DEFAULT_TIMEOUT_MS } = opts;\r\n\r\n if (!agentHash) throw new ProvenoncePartnerError('agentHash is required', 400);\r\n if (!partnerKey?.startsWith('pvp_')) {\r\n throw new ProvenoncePartnerError('partnerKey must start with pvp_', 400);\r\n }\r\n\r\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v1/sigil/check?hash=${encodeURIComponent(agentHash)}`;\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n\r\n let res: Response;\r\n try {\r\n res = await fetch(url, {\r\n headers: { Authorization: `Bearer ${partnerKey}` },\r\n signal: controller.signal,\r\n });\r\n } catch (err: any) {\r\n clearTimeout(timer);\r\n if (err?.name === 'AbortError') {\r\n throw new ProvenoncePartnerError(`Request timed out after ${timeoutMs}ms`, 408);\r\n }\r\n throw new ProvenoncePartnerError(`Network error: ${err?.message ?? err}`, 0);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n\r\n if (res.status === 401 || res.status === 403) {\r\n const body = await res.json().catch(() => ({}));\r\n throw new ProvenoncePartnerError(\r\n (body as any)?.error ?? 'Partner key rejected',\r\n res.status,\r\n );\r\n }\r\n\r\n if (res.status === 429) {\r\n throw new ProvenoncePartnerError('Rate limit exceeded', 429);\r\n }\r\n\r\n if (!res.ok) {\r\n throw new ProvenoncePartnerError(`Unexpected response: ${res.status}`, res.status);\r\n }\r\n\r\n const data: any = await res.json();\r\n\r\n if (data.valid === true) {\r\n return {\r\n valid: true,\r\n sigil: data.sigil ?? '',\r\n identityClass: data.identity_class ?? '',\r\n tier: data.tier ?? '',\r\n };\r\n }\r\n\r\n return {\r\n valid: false,\r\n reason: data.reason ?? 'no_sigil',\r\n signupUrl: data.signup_url ?? null,\r\n };\r\n}\r\n\r\n// ── Error class ───────────────────────────────────────────────────────────────\r\n\r\nexport class ProvenoncePartnerError extends Error {\r\n readonly status: number;\r\n\r\n constructor(message: string, status: number) {\r\n super(message);\r\n this.name = 'ProvenoncePartnerError';\r\n this.status = status;\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AA6C3B,eAAsB,WAAW,MAAoD;AACnF,QAAM,EAAE,WAAW,YAAY,UAAU,kBAAkB,YAAY,mBAAmB,IAAI;AAE9F,MAAI,CAAC,UAAW,OAAM,IAAI,uBAAuB,yBAAyB,GAAG;AAC7E,MAAI,CAAC,YAAY,WAAW,MAAM,GAAG;AACnC,UAAM,IAAI,uBAAuB,mCAAmC,GAAG;AAAA,EACzE;AAEA,QAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,4BAA4B,mBAAmB,SAAS,CAAC;AAElG,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE5D,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,SAAS,EAAE,eAAe,UAAU,UAAU,GAAG;AAAA,MACjD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,iBAAa,KAAK;AAClB,QAAI,KAAK,SAAS,cAAc;AAC9B,YAAM,IAAI,uBAAuB,2BAA2B,SAAS,MAAM,GAAG;AAAA,IAChF;AACA,UAAM,IAAI,uBAAuB,kBAAkB,KAAK,WAAW,GAAG,IAAI,CAAC;AAAA,EAC7E,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,UAAM,IAAI;AAAA,MACP,MAAc,SAAS;AAAA,MACxB,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,IAAI,uBAAuB,uBAAuB,GAAG;AAAA,EAC7D;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,uBAAuB,wBAAwB,IAAI,MAAM,IAAI,IAAI,MAAM;AAAA,EACnF;AAEA,QAAM,OAAY,MAAM,IAAI,KAAK;AAEjC,MAAI,KAAK,UAAU,MAAM;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,KAAK,SAAS;AAAA,MACrB,eAAe,KAAK,kBAAkB;AAAA,MACtC,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,KAAK,UAAU;AAAA,IACvB,WAAW,KAAK,cAAc;AAAA,EAChC;AACF;AAIO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAGhD,YAAY,SAAiB,QAAgB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,68 @@
1
+ // src/index.ts
2
+ var DEFAULT_BASE_URL = "https://provenonce.io";
3
+ var DEFAULT_TIMEOUT_MS = 5e3;
4
+ async function checkSigil(opts) {
5
+ const { agentHash, partnerKey, baseUrl = DEFAULT_BASE_URL, timeoutMs = DEFAULT_TIMEOUT_MS } = opts;
6
+ if (!agentHash) throw new ProvenoncePartnerError("agentHash is required", 400);
7
+ if (!partnerKey?.startsWith("pvp_")) {
8
+ throw new ProvenoncePartnerError("partnerKey must start with pvp_", 400);
9
+ }
10
+ const url = `${baseUrl.replace(/\/$/, "")}/api/v1/sigil/check?hash=${encodeURIComponent(agentHash)}`;
11
+ const controller = new AbortController();
12
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
13
+ let res;
14
+ try {
15
+ res = await fetch(url, {
16
+ headers: { Authorization: `Bearer ${partnerKey}` },
17
+ signal: controller.signal
18
+ });
19
+ } catch (err) {
20
+ clearTimeout(timer);
21
+ if (err?.name === "AbortError") {
22
+ throw new ProvenoncePartnerError(`Request timed out after ${timeoutMs}ms`, 408);
23
+ }
24
+ throw new ProvenoncePartnerError(`Network error: ${err?.message ?? err}`, 0);
25
+ } finally {
26
+ clearTimeout(timer);
27
+ }
28
+ if (res.status === 401 || res.status === 403) {
29
+ const body = await res.json().catch(() => ({}));
30
+ throw new ProvenoncePartnerError(
31
+ body?.error ?? "Partner key rejected",
32
+ res.status
33
+ );
34
+ }
35
+ if (res.status === 429) {
36
+ throw new ProvenoncePartnerError("Rate limit exceeded", 429);
37
+ }
38
+ if (!res.ok) {
39
+ throw new ProvenoncePartnerError(`Unexpected response: ${res.status}`, res.status);
40
+ }
41
+ const data = await res.json();
42
+ if (data.valid === true) {
43
+ return {
44
+ valid: true,
45
+ sigil: data.sigil ?? "",
46
+ identityClass: data.identity_class ?? "",
47
+ tier: data.tier ?? ""
48
+ };
49
+ }
50
+ return {
51
+ valid: false,
52
+ reason: data.reason ?? "no_sigil",
53
+ signupUrl: data.signup_url ?? null
54
+ };
55
+ }
56
+ var ProvenoncePartnerError = class extends Error {
57
+ constructor(message, status) {
58
+ super(message);
59
+ this.name = "ProvenoncePartnerError";
60
+ this.status = status;
61
+ Object.setPrototypeOf(this, new.target.prototype);
62
+ }
63
+ };
64
+ export {
65
+ ProvenoncePartnerError,
66
+ checkSigil
67
+ };
68
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\r\n * @provenonce/partner — Provenonce Partner SDK\r\n *\r\n * For skill developers. Wraps GET /api/v1/sigil/check so any skill can verify\r\n * an agent's SIGIL and get a signup URL in one call.\r\n *\r\n * Usage (server-side only — partner key must never be in a client bundle):\r\n *\r\n * import { checkSigil } from '@provenonce/partner'\r\n *\r\n * const result = await checkSigil({\r\n * agentHash: '0x1234...',\r\n * partnerKey: process.env.PROVENONCE_PARTNER_KEY!,\r\n * })\r\n *\r\n * if (!result.valid) {\r\n * return redirect(result.signupUrl)\r\n * }\r\n */\r\n\r\nconst DEFAULT_BASE_URL = 'https://provenonce.io';\r\nconst DEFAULT_TIMEOUT_MS = 5_000;\r\n\r\n// ── Types ─────────────────────────────────────────────────────────────────────\r\n\r\nexport interface SigilCheckOptions {\r\n /** Agent hash to check (0x-prefixed 64-char hex) */\r\n agentHash: string;\r\n /** Your pvp_ partner key — server-side only, never expose to clients */\r\n partnerKey: string;\r\n /** Base URL override (default: https://provenonce.io) */\r\n baseUrl?: string;\r\n /** Request timeout in ms (default: 5000) */\r\n timeoutMs?: number;\r\n}\r\n\r\n/** Agent has a valid SIGIL */\r\nexport interface SigilCheckValid {\r\n valid: true;\r\n sigil: string;\r\n identityClass: string;\r\n tier: string;\r\n}\r\n\r\n/** Agent has no SIGIL (or is inactive) — signupUrl is pre-built with your ref token */\r\nexport interface SigilCheckInvalid {\r\n valid: false;\r\n reason: 'no_sigil' | 'inactive' | 'not_registered';\r\n /** Pre-built signup URL with your ref token embedded. Redirect the user here. */\r\n signupUrl: string | null;\r\n}\r\n\r\nexport type SigilCheckResult = SigilCheckValid | SigilCheckInvalid;\r\n\r\n// ── Main function ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Check whether an agent has a valid SIGIL.\r\n *\r\n * Server-side only. The `partnerKey` (pvp_...) must never be sent to clients.\r\n *\r\n * On success: returns { valid: true, sigil, identityClass, tier }\r\n * On no SIGIL: returns { valid: false, reason, signupUrl } — redirect to signupUrl\r\n * On auth error: throws ProvenoncePartnerError with status 401/403\r\n * On rate limit: throws ProvenoncePartnerError with status 429\r\n */\r\nexport async function checkSigil(opts: SigilCheckOptions): Promise<SigilCheckResult> {\r\n const { agentHash, partnerKey, baseUrl = DEFAULT_BASE_URL, timeoutMs = DEFAULT_TIMEOUT_MS } = opts;\r\n\r\n if (!agentHash) throw new ProvenoncePartnerError('agentHash is required', 400);\r\n if (!partnerKey?.startsWith('pvp_')) {\r\n throw new ProvenoncePartnerError('partnerKey must start with pvp_', 400);\r\n }\r\n\r\n const url = `${baseUrl.replace(/\\/$/, '')}/api/v1/sigil/check?hash=${encodeURIComponent(agentHash)}`;\r\n\r\n const controller = new AbortController();\r\n const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n\r\n let res: Response;\r\n try {\r\n res = await fetch(url, {\r\n headers: { Authorization: `Bearer ${partnerKey}` },\r\n signal: controller.signal,\r\n });\r\n } catch (err: any) {\r\n clearTimeout(timer);\r\n if (err?.name === 'AbortError') {\r\n throw new ProvenoncePartnerError(`Request timed out after ${timeoutMs}ms`, 408);\r\n }\r\n throw new ProvenoncePartnerError(`Network error: ${err?.message ?? err}`, 0);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n\r\n if (res.status === 401 || res.status === 403) {\r\n const body = await res.json().catch(() => ({}));\r\n throw new ProvenoncePartnerError(\r\n (body as any)?.error ?? 'Partner key rejected',\r\n res.status,\r\n );\r\n }\r\n\r\n if (res.status === 429) {\r\n throw new ProvenoncePartnerError('Rate limit exceeded', 429);\r\n }\r\n\r\n if (!res.ok) {\r\n throw new ProvenoncePartnerError(`Unexpected response: ${res.status}`, res.status);\r\n }\r\n\r\n const data: any = await res.json();\r\n\r\n if (data.valid === true) {\r\n return {\r\n valid: true,\r\n sigil: data.sigil ?? '',\r\n identityClass: data.identity_class ?? '',\r\n tier: data.tier ?? '',\r\n };\r\n }\r\n\r\n return {\r\n valid: false,\r\n reason: data.reason ?? 'no_sigil',\r\n signupUrl: data.signup_url ?? null,\r\n };\r\n}\r\n\r\n// ── Error class ───────────────────────────────────────────────────────────────\r\n\r\nexport class ProvenoncePartnerError extends Error {\r\n readonly status: number;\r\n\r\n constructor(message: string, status: number) {\r\n super(message);\r\n this.name = 'ProvenoncePartnerError';\r\n this.status = status;\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n"],"mappings":";AAoBA,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AA6C3B,eAAsB,WAAW,MAAoD;AACnF,QAAM,EAAE,WAAW,YAAY,UAAU,kBAAkB,YAAY,mBAAmB,IAAI;AAE9F,MAAI,CAAC,UAAW,OAAM,IAAI,uBAAuB,yBAAyB,GAAG;AAC7E,MAAI,CAAC,YAAY,WAAW,MAAM,GAAG;AACnC,UAAM,IAAI,uBAAuB,mCAAmC,GAAG;AAAA,EACzE;AAEA,QAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,4BAA4B,mBAAmB,SAAS,CAAC;AAElG,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE5D,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,SAAS,EAAE,eAAe,UAAU,UAAU,GAAG;AAAA,MACjD,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,iBAAa,KAAK;AAClB,QAAI,KAAK,SAAS,cAAc;AAC9B,YAAM,IAAI,uBAAuB,2BAA2B,SAAS,MAAM,GAAG;AAAA,IAChF;AACA,UAAM,IAAI,uBAAuB,kBAAkB,KAAK,WAAW,GAAG,IAAI,CAAC;AAAA,EAC7E,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,UAAM,IAAI;AAAA,MACP,MAAc,SAAS;AAAA,MACxB,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,IAAI,uBAAuB,uBAAuB,GAAG;AAAA,EAC7D;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,uBAAuB,wBAAwB,IAAI,MAAM,IAAI,IAAI,MAAM;AAAA,EACnF;AAEA,QAAM,OAAY,MAAM,IAAI,KAAK;AAEjC,MAAI,KAAK,UAAU,MAAM;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,KAAK,SAAS;AAAA,MACrB,eAAe,KAAK,kBAAkB;AAAA,MACtC,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,KAAK,UAAU;AAAA,IACvB,WAAW,KAAK,cAAc;AAAA,EAChC;AACF;AAIO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAGhD,YAAY,SAAiB,QAAgB;AAC3C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@provenonce/partner",
3
+ "version": "1.0.0",
4
+ "description": "Provenonce Partner SDK — SIGIL verification for skill developers",
5
+ "license": "MIT",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "provenonce",
26
+ "sigil",
27
+ "partner",
28
+ "agent",
29
+ "skill",
30
+ "verification"
31
+ ],
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://provenonce.dev",
35
+ "directory": "sdk/partner"
36
+ },
37
+ "devDependencies": {
38
+ "tsup": "^8.0.0",
39
+ "typescript": "^5.0.0"
40
+ }
41
+ }