@m1a0rz/agent-identity 0.5.2 → 0.5.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAkG3E,iBAAS,YAAY,CAAC,GAAG,EAAE,iBAAiB,QAqjB3C;wBAMwC,OAAO,YAAY;AAA5D,wBAA6D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAmG3E,iBAAS,YAAY,CAAC,GAAG,EAAE,iBAAiB,QAyjB3C;wBAMwC,OAAO,YAAY;AAA5D,wBAA6D"}
package/dist/index.js CHANGED
@@ -54,6 +54,7 @@ import { parseSessionKeyToDeliveryTarget, } from "./src/utils/derive-session-key
54
54
  import { createSessionPutHandler, createSessionGetHandler, } from "./src/gateway/identity-session-methods.js";
55
55
  import { logDebug, logInfo, logWarn } from "./src/utils/logger.js";
56
56
  import { initEncryptionKey } from "./src/store/encryption.js";
57
+ import { setSiteMetadataUrl } from "./src/utils/resolve-identity-endpoint.js";
57
58
  import { startIdentitySocket, stopIdentitySocket } from "./src/local-server/identity-socket.js";
58
59
  const PLUGIN_STORE_DIR = "~/.openclaw/plugins/identity";
59
60
  /**
@@ -92,6 +93,10 @@ function registerImpl(api) {
92
93
  const storeDir = api.resolvePath(PLUGIN_STORE_DIR);
93
94
  initEncryptionKey(storeDir);
94
95
  const identityCfg = pluginConfig.identity;
96
+ if (identityCfg?.siteMetadataUrl) {
97
+ setSiteMetadataUrl(identityCfg.siteMetadataUrl);
98
+ logInfo(api.logger, `identity.siteMetadataUrl: ${identityCfg.siteMetadataUrl}`);
99
+ }
95
100
  setPersonalSessionMode(identityCfg?.personalSessionMode === true);
96
101
  if (identityCfg?.personalSessionMode) {
97
102
  logInfo(api.logger, "identity.personalSessionMode: non-subagent TIP/session/credentials use agent:main:main only");
@@ -24,6 +24,12 @@ export type IdentityConfig = {
24
24
  * Lower priority than `endpoint`.
25
25
  */
26
26
  regionMetadataUrl?: string;
27
+ /**
28
+ * URL to fetch deployment site name (e.g. http://100.96.0.96/volcstack/latest/site_name).
29
+ * Response "BytePlus" → byteplusapi.com, otherwise → volcengineapi.com.
30
+ * Default: http://100.96.0.96/volcstack/latest/site_name
31
+ */
32
+ siteMetadataUrl?: string;
27
33
  accessKeyId?: string;
28
34
  secretAccessKey?: string;
29
35
  sessionToken?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,37 @@
1
1
  /**
2
- * Resolve Volcengine Identity API base URL.
3
- * Priority: explicit endpoint > region from regionMetadataUrl -> https://id.{region}.volcengineapi.com > cn-beijing default.
2
+ * Resolve Volcengine / BytePlus Identity API base URL.
3
+ *
4
+ * Site detection: GET http://100.96.0.96/volcstack/latest/site_name
5
+ * - "BytePlus" → byteplusapi.com
6
+ * - anything else / failure → volcengineapi.com (default)
7
+ *
8
+ * Endpoint priority:
9
+ * explicit endpoint > region from regionMetadataUrl → https://id.{region}.{domain} > cn-beijing default.
4
10
  */
11
+ export declare const VOLCENGINE_API_DOMAIN = "volcengineapi.com";
12
+ export declare const BYTEPLUS_API_DOMAIN = "byteplusapi.com";
5
13
  export declare const DEFAULT_IDENTITY_ENDPOINT = "https://id.cn-beijing.volcengineapi.com";
14
+ /**
15
+ * Fetch ECS site name from metadata service.
16
+ * Returns the trimmed text body (e.g. "BytePlus") or null on any failure.
17
+ */
18
+ export declare function fetchSiteName(url: string, options?: {
19
+ totalTimeoutMs?: number;
20
+ }): Promise<string | null>;
21
+ export declare function apiDomainForSite(siteName: string | null): string;
22
+ /**
23
+ * Override the default site metadata URL.
24
+ * Call once at plugin init when config.identity.siteMetadataUrl is provided.
25
+ */
26
+ export declare function setSiteMetadataUrl(url: string): void;
27
+ /**
28
+ * Resolve the API domain suffix once per process.
29
+ * Only fetches ECS site metadata when siteMetadataUrl is explicitly configured;
30
+ * otherwise returns volcengineapi.com immediately (no network request).
31
+ */
32
+ export declare function resolveApiDomain(): Promise<string>;
33
+ /** @internal — only for tests. */
34
+ export declare function _resetCachedApiDomain(): void;
6
35
  /**
7
36
  * GET metadata URL; expect plain-text region id (e.g. cn-beijing).
8
37
  * Uses total request timeout (similar to curl --max-time 10).
@@ -10,17 +39,18 @@ export declare const DEFAULT_IDENTITY_ENDPOINT = "https://id.cn-beijing.volcengi
10
39
  export declare function fetchRegionIdFromMetadata(metadataUrl: string, options?: {
11
40
  totalTimeoutMs?: number;
12
41
  }): Promise<string | null>;
13
- export declare function identityEndpointFromRegion(region: string): string;
42
+ export declare function identityEndpointFromRegion(region: string, apiDomain?: string): string;
14
43
  export type ResolveIdentityApiEndpointInput = {
15
44
  endpoint?: string;
16
45
  regionMetadataUrl?: string;
17
46
  };
18
47
  /**
19
48
  * Resolve Identity control/data plane base URL for signing and requests.
49
+ * Automatically detects BytePlus vs Volcengine site from ECS metadata.
20
50
  */
21
51
  export declare function resolveIdentityApiEndpoint(input: ResolveIdentityApiEndpointInput): Promise<string>;
22
52
  /**
23
- * Derive Volcengine signing region from Identity endpoint host id.{region}.volcengineapi.com.
53
+ * Derive signing region from Identity endpoint host: id.{region}.(volcengineapi|byteplusapi).com.
24
54
  */
25
55
  export declare function signingRegionFromIdentityEndpoint(baseUrl: string): string | null;
26
56
  //# sourceMappingURL=resolve-identity-endpoint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-identity-endpoint.d.ts","sourceRoot":"","sources":["../../../src/utils/resolve-identity-endpoint.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AAEH,eAAO,MAAM,yBAAyB,4CAA4C,CAAC;AAUnF;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhF"}
1
+ {"version":3,"file":"resolve-identity-endpoint.d.ts","sourceRoot":"","sources":["../../../src/utils/resolve-identity-endpoint.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;GASG;AAEH,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AACzD,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD,eAAO,MAAM,yBAAyB,4CAAmD,CAAC;AAM1F;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIhE;AAcD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAWlD;AAED,kCAAkC;AAClC,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAUD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAErF;AAID,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQhF"}
@@ -14,11 +14,85 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  /**
17
- * Resolve Volcengine Identity API base URL.
18
- * Priority: explicit endpoint > region from regionMetadataUrl -> https://id.{region}.volcengineapi.com > cn-beijing default.
17
+ * Resolve Volcengine / BytePlus Identity API base URL.
18
+ *
19
+ * Site detection: GET http://100.96.0.96/volcstack/latest/site_name
20
+ * - "BytePlus" → byteplusapi.com
21
+ * - anything else / failure → volcengineapi.com (default)
22
+ *
23
+ * Endpoint priority:
24
+ * explicit endpoint > region from regionMetadataUrl → https://id.{region}.{domain} > cn-beijing default.
19
25
  */
20
- export const DEFAULT_IDENTITY_ENDPOINT = "https://id.cn-beijing.volcengineapi.com";
26
+ export const VOLCENGINE_API_DOMAIN = "volcengineapi.com";
27
+ export const BYTEPLUS_API_DOMAIN = "byteplusapi.com";
28
+ export const DEFAULT_IDENTITY_ENDPOINT = `https://id.cn-beijing.${VOLCENGINE_API_DOMAIN}`;
21
29
  const DEFAULT_TOTAL_TIMEOUT_MS = 10_000;
30
+ // ── Site detection ──────────────────────────────────────────────────────
31
+ /**
32
+ * Fetch ECS site name from metadata service.
33
+ * Returns the trimmed text body (e.g. "BytePlus") or null on any failure.
34
+ */
35
+ export async function fetchSiteName(url, options) {
36
+ const totalTimeoutMs = options?.totalTimeoutMs ?? 3_000;
37
+ const controller = new AbortController();
38
+ const timer = setTimeout(() => controller.abort(), totalTimeoutMs);
39
+ try {
40
+ const res = await fetch(url, { signal: controller.signal, redirect: "follow" });
41
+ if (!res.ok)
42
+ return null;
43
+ const text = (await res.text()).trim();
44
+ return text || null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ finally {
50
+ clearTimeout(timer);
51
+ }
52
+ }
53
+ export function apiDomainForSite(siteName) {
54
+ return siteName?.trim().toLowerCase() === "byteplus"
55
+ ? BYTEPLUS_API_DOMAIN
56
+ : VOLCENGINE_API_DOMAIN;
57
+ }
58
+ const SITE_STATE_KEY = Symbol.for("openclaw-identity.siteDetectionState");
59
+ const _g = globalThis;
60
+ if (!_g[SITE_STATE_KEY]) {
61
+ _g[SITE_STATE_KEY] = { cachedApiDomain: null, customSiteMetadataUrl: null };
62
+ }
63
+ const siteState = _g[SITE_STATE_KEY];
64
+ /**
65
+ * Override the default site metadata URL.
66
+ * Call once at plugin init when config.identity.siteMetadataUrl is provided.
67
+ */
68
+ export function setSiteMetadataUrl(url) {
69
+ siteState.customSiteMetadataUrl = url.trim() || null;
70
+ siteState.cachedApiDomain = null;
71
+ }
72
+ /**
73
+ * Resolve the API domain suffix once per process.
74
+ * Only fetches ECS site metadata when siteMetadataUrl is explicitly configured;
75
+ * otherwise returns volcengineapi.com immediately (no network request).
76
+ */
77
+ export function resolveApiDomain() {
78
+ if (!siteState.cachedApiDomain) {
79
+ if (siteState.customSiteMetadataUrl) {
80
+ siteState.cachedApiDomain = fetchSiteName(siteState.customSiteMetadataUrl)
81
+ .then(apiDomainForSite)
82
+ .catch(() => VOLCENGINE_API_DOMAIN);
83
+ }
84
+ else {
85
+ siteState.cachedApiDomain = Promise.resolve(VOLCENGINE_API_DOMAIN);
86
+ }
87
+ }
88
+ return siteState.cachedApiDomain;
89
+ }
90
+ /** @internal — only for tests. */
91
+ export function _resetCachedApiDomain() {
92
+ siteState.cachedApiDomain = null;
93
+ siteState.customSiteMetadataUrl = null;
94
+ }
95
+ // ── Region detection ────────────────────────────────────────────────────
22
96
  /** Region values that must not be used to build an endpoint. */
23
97
  function isInvalidRegionId(text) {
24
98
  const t = text.trim().toLowerCase();
@@ -56,32 +130,34 @@ export async function fetchRegionIdFromMetadata(metadataUrl, options) {
56
130
  clearTimeout(timer);
57
131
  }
58
132
  }
59
- export function identityEndpointFromRegion(region) {
60
- return `https://id.${region.trim()}.volcengineapi.com`;
133
+ export function identityEndpointFromRegion(region, apiDomain) {
134
+ return `https://id.${region.trim()}.${apiDomain ?? VOLCENGINE_API_DOMAIN}`;
61
135
  }
62
136
  /**
63
137
  * Resolve Identity control/data plane base URL for signing and requests.
138
+ * Automatically detects BytePlus vs Volcengine site from ECS metadata.
64
139
  */
65
140
  export async function resolveIdentityApiEndpoint(input) {
66
141
  const explicit = input.endpoint?.trim();
67
142
  if (explicit)
68
143
  return explicit;
69
- const fallback = DEFAULT_IDENTITY_ENDPOINT;
144
+ const apiDomain = await resolveApiDomain();
145
+ const fallback = `https://id.cn-beijing.${apiDomain}`;
70
146
  const metaUrl = input.regionMetadataUrl?.trim();
71
147
  if (metaUrl) {
72
148
  const region = await fetchRegionIdFromMetadata(metaUrl);
73
149
  if (region)
74
- return identityEndpointFromRegion(region);
150
+ return identityEndpointFromRegion(region, apiDomain);
75
151
  }
76
152
  return fallback;
77
153
  }
78
154
  /**
79
- * Derive Volcengine signing region from Identity endpoint host id.{region}.volcengineapi.com.
155
+ * Derive signing region from Identity endpoint host: id.{region}.(volcengineapi|byteplusapi).com.
80
156
  */
81
157
  export function signingRegionFromIdentityEndpoint(baseUrl) {
82
158
  try {
83
159
  const host = new URL(baseUrl).host;
84
- const m = /^id\.([a-z0-9-]+)\.volcengineapi\.com$/i.exec(host);
160
+ const m = /^id\.([a-z0-9-]+)\.(volcengineapi|byteplusapi)\.com$/i.exec(host);
85
161
  return m ? m[1] : null;
86
162
  }
87
163
  catch {
@@ -17,7 +17,11 @@
17
17
  },
18
18
  "regionMetadataUrl": {
19
19
  "type": "string",
20
- "description": "GET this URL for plain-text region id (e.g. http://100.96.0.96/latest/region_id). When endpoint is unset, builds https://id.{region}.volcengineapi.com. Request timeout ~10s; on failure falls back to https://id.cn-beijing.volcengineapi.com"
20
+ "description": "GET this URL for plain-text region id (e.g. http://100.96.0.96/latest/region_id). When endpoint is unset, builds https://id.{region}.{domain}. Request timeout ~10s; on failure falls back to cn-beijing default."
21
+ },
22
+ "siteMetadataUrl": {
23
+ "type": "string",
24
+ "description": "URL to fetch deployment site name (e.g. http://100.96.0.96/volcstack/latest/site_name). Response 'BytePlus' → byteplusapi.com, otherwise → volcengineapi.com. Default: http://100.96.0.96/volcstack/latest/site_name"
21
25
  },
22
26
  "accessKeyId": {
23
27
  "type": "string",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m1a0rz/agent-identity",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Agent Identity: UserPool (用户池) login, TIP token (工作负载令牌), credential hosting (凭据托管 OAuth2/API key), optional tool/skill permission control (CheckPermission) and risk approval. Integrates with Volcengine 智能体身份和权限管理平台.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",