@agentunion/fastaun 0.5.26 → 0.5.27

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/_packed_docs/CHANGELOG.md +41 -0
  3. package/_packed_docs/INDEX.md +22 -14
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -6
  5. package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +16 -1
  6. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +37 -9
  7. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +20 -9
  8. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +57 -12
  9. package/_packed_docs/cli//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241CLI/345/274/200/345/217/221/344/270/216/344/275/277/347/224/250/346/214/207/345/215/227.md +869 -0
  10. package/_packed_docs/sdk/0.5.22-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +2 -2
  11. package/_packed_docs/sdk/0.5.27-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +408 -0
  12. package/_packed_docs/sdk/0.5.27-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +410 -0
  13. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +2 -2
  14. package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +187 -73
  15. package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +1 -1
  16. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +13 -9
  17. package/_packed_docs/sdk/INDEX.md +21 -13
  18. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +973 -266
  19. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +950 -242
  20. package/dist/agent-md-schema.js +1 -1
  21. package/dist/agent-md-schema.js.map +1 -1
  22. package/dist/agent-md.js +5 -0
  23. package/dist/agent-md.js.map +1 -1
  24. package/dist/aid.js +3 -3
  25. package/dist/aid.js.map +1 -1
  26. package/dist/auth.js +21 -19
  27. package/dist/auth.js.map +1 -1
  28. package/dist/cert-utils.d.ts +1 -1
  29. package/dist/cert-utils.js +4 -4
  30. package/dist/cert-utils.js.map +1 -1
  31. package/dist/client/lifecycle.d.ts +1 -1
  32. package/dist/client/lifecycle.js.map +1 -1
  33. package/dist/client/rpc-pipeline.js +8 -1
  34. package/dist/client/rpc-pipeline.js.map +1 -1
  35. package/dist/client/v2-e2ee.js +7 -0
  36. package/dist/client/v2-e2ee.js.map +1 -1
  37. package/dist/client.d.ts +12 -0
  38. package/dist/client.js +305 -29
  39. package/dist/client.js.map +1 -1
  40. package/dist/facades.d.ts +38 -0
  41. package/dist/facades.js +49 -5
  42. package/dist/facades.js.map +1 -1
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/org-protocol.d.ts +1 -0
  47. package/dist/org-protocol.js +39 -36
  48. package/dist/org-protocol.js.map +1 -1
  49. package/dist/ownership-v21.js +7 -7
  50. package/dist/ownership-v21.js.map +1 -1
  51. package/dist/register-flow.js +2 -2
  52. package/dist/register-flow.js.map +1 -1
  53. package/dist/semantic-facade.d.ts +176 -0
  54. package/dist/semantic-facade.js +611 -0
  55. package/dist/semantic-facade.js.map +1 -0
  56. package/dist/semantic-protocol.d.ts +810 -0
  57. package/dist/semantic-protocol.js +894 -0
  58. package/dist/semantic-protocol.js.map +1 -0
  59. package/dist/tools/cross-sdk-agent.d.ts +11 -1
  60. package/dist/tools/cross-sdk-agent.js +388 -7
  61. package/dist/tools/cross-sdk-agent.js.map +1 -1
  62. package/dist/transport.d.ts +1 -0
  63. package/dist/transport.js +28 -2
  64. package/dist/transport.js.map +1 -1
  65. package/dist/v2/e2ee/decrypt.d.ts +5 -0
  66. package/dist/v2/e2ee/decrypt.js +22 -2
  67. package/dist/v2/e2ee/decrypt.js.map +1 -1
  68. package/dist/version.d.ts +1 -1
  69. package/dist/version.js +1 -1
  70. package/package.json +1 -1
package/dist/auth.js CHANGED
@@ -112,13 +112,13 @@ function _extractPublicKey(cert) {
112
112
  }
113
113
  const CERT_CLOCK_SKEW_MS = 300_000;
114
114
  /** 检查证书时间有效性,允许测试环境和容器之间存在短暂时钟偏差 */
115
- function _ensureCertTimeValid(cert, label, nowMs) {
115
+ function _ensureCertTimeValid(cert, label, nowMs, clockSkewMs = CERT_CLOCK_SKEW_MS) {
116
116
  const notBefore = new Date(cert.validFrom).getTime();
117
117
  const notAfter = new Date(cert.validTo).getTime();
118
- if (nowMs + CERT_CLOCK_SKEW_MS < notBefore) {
118
+ if (nowMs + clockSkewMs < notBefore) {
119
119
  throw new AuthError(`${label} is not yet valid`);
120
120
  }
121
- if (nowMs - CERT_CLOCK_SKEW_MS > notAfter) {
121
+ if (nowMs - clockSkewMs > notAfter) {
122
122
  throw new AuthError(`${label} has expired`);
123
123
  }
124
124
  }
@@ -338,7 +338,7 @@ function _strictCrlRevokedSerials(pem, issuer, now) {
338
338
  };
339
339
  const thisUpdate = crlTime(tbs[offset + 2]);
340
340
  const nextUpdate = crlTime(tbs[offset + 3]);
341
- if (thisUpdate > now + 5 || nextUpdate <= now || nextUpdate <= thisUpdate)
341
+ if (thisUpdate > now + 300 || now > nextUpdate + 300 || nextUpdate <= thisUpdate)
342
342
  throw new AuthError('service event CRL is not current');
343
343
  const revoked = new Set();
344
344
  if (tbs[offset + 4]?.tag === 0x30)
@@ -401,7 +401,7 @@ function _verifyOwnershipOcsp(der, certificate, issuer, now) {
401
401
  if (!responderValid)
402
402
  throw new ValidationError('OCSP responder is not the verified issuer', { stringCode: 'invalid' });
403
403
  const producedAt = _ownershipOcspTime(tbs[offset++]);
404
- if (producedAt > now + 5 || producedAt < now - 90)
404
+ if (producedAt > now + 300 || producedAt < now - 390)
405
405
  throw new StateError('OCSP response is not current', { stringCode: 'unavailable', retryable: true });
406
406
  const responses = _ownershipDerChildren(tbs[offset++], 0x30);
407
407
  let status;
@@ -429,7 +429,7 @@ function _verifyOwnershipOcsp(der, certificate, issuer, now) {
429
429
  const nextUpdate = _ownershipOcspTime(_ownershipDerChildren(single[3])[0]);
430
430
  nextRefreshAt = nextUpdate * 1000;
431
431
  currentUntil = Math.min(currentUntil, (thisUpdate + 30) * 1000);
432
- if (thisUpdate > now + 5 || thisUpdate < now - 30 || nextUpdate <= now || nextUpdate <= thisUpdate)
432
+ if (thisUpdate > now + 300 || thisUpdate < now - 330 || now > nextUpdate + 300 || nextUpdate <= thisUpdate)
433
433
  throw new StateError('OCSP validity window is not current', { stringCode: 'unavailable', retryable: true });
434
434
  if (single[1].tag === 0x80 && single[1].content.length === 0)
435
435
  status = 'good';
@@ -941,7 +941,7 @@ export class AuthFlow {
941
941
  try {
942
942
  const cert = _loadX509(certPem);
943
943
  if (signedAt !== undefined) {
944
- _ensureCertTimeValid(cert, 'peer certificate', signedAt * 1000);
944
+ _ensureCertTimeValid(cert, 'peer certificate', signedAt * 1000, 0);
945
945
  await this._verifyAuthCertChain(gatewayUrl, cert, expectedAid, signedAt);
946
946
  if (_certSubjectCN(cert) !== expectedAid)
947
947
  throw new AuthError(`peer cert CN mismatch: expected ${expectedAid}`);
@@ -960,7 +960,7 @@ export class AuthFlow {
960
960
  if (!chain.length)
961
961
  throw new AuthError('service event certificate chain is unavailable');
962
962
  const current = Math.trunc(Date.now() / 1000);
963
- if ([cert, ...chain].some((item) => current < Math.trunc(Date.parse(item.validFrom) / 1000) || current > Math.trunc(Date.parse(item.validTo) / 1000)))
963
+ if ([cert, ...chain].some((item) => current < Math.trunc(Date.parse(item.validFrom) / 1000) - 300 || current > Math.trunc(Date.parse(item.validTo) / 1000) + 300))
964
964
  throw new AuthError('service event certificate is outside its validity window');
965
965
  await this._verifyAuthCertChain(gatewayUrl, cert, expectedAid, undefined, true, chain);
966
966
  const crl = await this._fetchGatewayCrl(gatewayUrl, chain[0], true);
@@ -1116,7 +1116,7 @@ export class AuthFlow {
1116
1116
  const observedText = headers['x-aun-cert-observed-at'] ?? '';
1117
1117
  const observed = Date.parse(observedText) / 1000;
1118
1118
  const now = Date.now() / 1000;
1119
- if (headers['x-aun-cert-consistency'] !== 'authoritative' || typeof state !== 'string' || !state || !headers['x-aun-cert-fingerprint'] || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/.test(observedText) || !Number.isFinite(observed) || observed > now + 5 || observed < now - 30)
1119
+ if (headers['x-aun-cert-consistency'] !== 'authoritative' || typeof state !== 'string' || !state || !headers['x-aun-cert-fingerprint'] || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/.test(observedText) || !Number.isFinite(observed) || observed > now + 300 || observed < now - 330)
1120
1120
  throw unavailable('ownership certificate authoritative current metadata is unavailable');
1121
1121
  if (state !== 'active_signing' || headers['x-aun-cert-fingerprint'] !== fingerprint)
1122
1122
  throw new ValidationError('ownership certificate lifecycle or fingerprint is invalid', { stringCode: 'invalid' });
@@ -1132,7 +1132,7 @@ export class AuthFlow {
1132
1132
  if (cert.subject.match(/(?:^|\n)CN=([^\n]+)/)?.[1] !== aid)
1133
1133
  throw new ValidationError('ownership certificate AID mismatch', { stringCode: 'invalid' });
1134
1134
  _ownershipCertConstraints(cert);
1135
- validateAgentMdCertificate(response.body, aid, Math.trunc(now), { now: Math.trunc(now), requireCurrentValidity: true });
1135
+ validateAgentMdCertificate(response.body, aid, Math.trunc(Math.min(Math.max(now, Date.parse(cert.validFrom) / 1000), Date.parse(cert.validTo) / 1000)), { now: Math.trunc(now), requireCurrentValidity: true });
1136
1136
  if (certFingerprint(response.body) !== fingerprint)
1137
1137
  throw new ValidationError('ownership certificate DER fingerprint mismatch', { stringCode: 'invalid' });
1138
1138
  const epoch = this._strictPkiEpoch;
@@ -1156,7 +1156,7 @@ export class AuthFlow {
1156
1156
  const constraints = _ownershipCertConstraints(issuer);
1157
1157
  if (constraints.pathLen !== undefined && index > constraints.pathLen)
1158
1158
  throw new ValidationError('ownership certificate path length is invalid', { stringCode: 'invalid' });
1159
- if (!constraints.basicPresent || !issuer.ca || !constraints.keyUsagePresent || !constraints.keyCertSign || Date.now() < Date.parse(issuer.validFrom) || Date.now() > Date.parse(issuer.validTo) || !current.checkIssued(issuer) || !current.verify(issuer.publicKey))
1159
+ if (!constraints.basicPresent || !issuer.ca || !constraints.keyUsagePresent || !constraints.keyCertSign || Date.now() < Date.parse(issuer.validFrom) - 300_000 || Date.now() > Date.parse(issuer.validTo) + 300_000 || !current.checkIssued(issuer) || !current.verify(issuer.publicKey))
1160
1160
  throw new ValidationError('ownership certificate chain is invalid', { stringCode: 'invalid' });
1161
1161
  current = issuer;
1162
1162
  }
@@ -1200,9 +1200,9 @@ export class AuthFlow {
1200
1200
  if (status !== 'good')
1201
1201
  throw unavailable('ownership certificate revocation status is unknown');
1202
1202
  const finalNow = Date.now();
1203
- if ([cert, ...chain].some((item) => finalNow < Date.parse(item.validFrom) || finalNow > Date.parse(item.validTo)))
1203
+ if ([cert, ...chain].some((item) => finalNow < Date.parse(item.validFrom) - 300_000 || finalNow > Date.parse(item.validTo) + 300_000))
1204
1204
  throw new ValidationError('ownership certificate chain is invalid', { stringCode: 'invalid' });
1205
- if (finalNow - began > 30_000 || finalNow / 1000 - observed > 30)
1205
+ if (finalNow - began > 30_000 || finalNow / 1000 - observed > 330)
1206
1206
  throw unavailable('ownership certificate verification window elapsed');
1207
1207
  return { certificate: { cert_pem: response.body, chain_valid: true, state, revoked: false, revocation_checked: true, observed_at: Math.trunc(observed) }, expiresAt: Math.min(began + 3600_000, (Math.trunc(observed) + 30) * 1000, evidence.currentUntil, evidence.nextRefreshAt, Date.parse(cert.validTo), ...chain.map((item) => Date.parse(item.validTo))) };
1208
1208
  }
@@ -1522,6 +1522,7 @@ export class AuthFlow {
1522
1522
  inline_realtime_payload_v1: true,
1523
1523
  agent_md_validation_v1: true,
1524
1524
  p2p_peer_pull_v1: true,
1525
+ gateway_migrate_v1: true,
1525
1526
  };
1526
1527
  const request = {
1527
1528
  nonce,
@@ -1636,7 +1637,8 @@ export class AuthFlow {
1636
1637
  async _verifyAuthCertChain(gatewayUrl, authCert, chainAid = '', signedAt, _fresh = false, suppliedChain) {
1637
1638
  const epoch = this._strictPkiEpoch;
1638
1639
  const nowMs = signedAt === undefined ? Date.now() : signedAt * 1000;
1639
- _ensureCertTimeValid(authCert, 'auth certificate', nowMs);
1640
+ const clockSkewMs = signedAt === undefined ? CERT_CLOCK_SKEW_MS : 0;
1641
+ _ensureCertTimeValid(authCert, 'auth certificate', nowMs, clockSkewMs);
1640
1642
  const chain = suppliedChain ?? await this._loadGatewayCaChain(gatewayUrl, chainAid);
1641
1643
  if (!chain.length) {
1642
1644
  throw new AuthError('unable to verify auth certificate chain: missing CA chain');
@@ -1648,14 +1650,14 @@ export class AuthFlow {
1648
1650
  const expiresAt = Math.min(now + this._chainCacheTtl, Date.parse(authCert.validTo), ...chain.map((cert) => Date.parse(cert.validTo)));
1649
1651
  const chainExpiresAt = Math.min(now + this._chainCacheTtl, ...chain.map((cert) => Date.parse(cert.validTo)));
1650
1652
  for (const caCert of chain)
1651
- _ensureCertTimeValid(caCert, 'CA certificate', nowMs);
1653
+ _ensureCertTimeValid(caCert, 'CA certificate', nowMs, clockSkewMs);
1652
1654
  // 检查缓存
1653
1655
  if ((this._chainVerifiedCache.get(certKey) ?? 0) > now)
1654
1656
  return;
1655
1657
  // 快速路径:CA 链已通过完整验证
1656
1658
  if ((this._gatewayCaVerified.get(cacheKey) ?? 0) > now) {
1657
1659
  const issuer = chain[0];
1658
- _ensureCertTimeValid(issuer, 'Issuer CA', nowMs);
1660
+ _ensureCertTimeValid(issuer, 'Issuer CA', nowMs, clockSkewMs);
1659
1661
  if (!_isCaCert(issuer)) {
1660
1662
  throw new AuthError('Issuer CA is not marked as CA (fast path)');
1661
1663
  }
@@ -1673,7 +1675,7 @@ export class AuthFlow {
1673
1675
  let current = authCert;
1674
1676
  for (let i = 0; i < chain.length; i++) {
1675
1677
  const caCert = chain[i];
1676
- _ensureCertTimeValid(caCert, `CA certificate[${i}]`, nowMs);
1678
+ _ensureCertTimeValid(caCert, `CA certificate[${i}]`, nowMs, clockSkewMs);
1677
1679
  if (!_checkIssuedBy(current, caCert)) {
1678
1680
  throw new AuthError(`auth certificate issuer mismatch at chain level ${i}`);
1679
1681
  }
@@ -2301,9 +2303,9 @@ export class AuthFlow {
2301
2303
  const now = Date.now();
2302
2304
  const validFrom = new Date(cert.validFrom).getTime();
2303
2305
  const validTo = new Date(cert.validTo).getTime();
2304
- if (now < validFrom)
2306
+ if (now < validFrom - 300_000)
2305
2307
  return 'cert not yet valid';
2306
- if (now > validTo)
2308
+ if (now > validTo + 300_000)
2307
2309
  return 'cert expired';
2308
2310
  return '';
2309
2311
  }