kontext-sdk 0.6.0 → 0.7.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.
- package/dist/index.d.mts +156 -1
- package/dist/index.d.ts +156 -1
- package/dist/index.js +247 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +243 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -2
package/dist/index.d.mts
CHANGED
|
@@ -765,6 +765,10 @@ interface VerifyInput extends LogTransactionInput {
|
|
|
765
765
|
confidence?: number;
|
|
766
766
|
/** Additional reasoning context */
|
|
767
767
|
context?: Record<string, unknown>;
|
|
768
|
+
/** When provided, anchors the terminal digest on-chain after compliance checks */
|
|
769
|
+
anchor?: OnChainAnchorConfig;
|
|
770
|
+
/** Counterparty agent for bilateral A2A attestation exchange */
|
|
771
|
+
counterparty?: CounterpartyConfig;
|
|
768
772
|
}
|
|
769
773
|
/** Result of the verify() convenience method */
|
|
770
774
|
interface VerifyResult {
|
|
@@ -790,6 +794,10 @@ interface VerifyResult {
|
|
|
790
794
|
};
|
|
791
795
|
/** Reasoning entry ID (present when reasoning was provided in input) */
|
|
792
796
|
reasoningId?: string;
|
|
797
|
+
/** On-chain anchor proof (present when anchor config provided in input) */
|
|
798
|
+
anchorProof?: AnchorResult;
|
|
799
|
+
/** Counterparty attestation (present when counterparty config provided in input) */
|
|
800
|
+
counterparty?: CounterpartyAttestation;
|
|
793
801
|
/** True when the transaction amount exceeds the approvalThreshold */
|
|
794
802
|
requiresApproval?: boolean;
|
|
795
803
|
/** The pending approval task (present when requiresApproval is true) */
|
|
@@ -852,6 +860,102 @@ interface ReasoningEntry {
|
|
|
852
860
|
/** Context */
|
|
853
861
|
context: Record<string, unknown>;
|
|
854
862
|
}
|
|
863
|
+
/** Configuration for on-chain digest anchoring */
|
|
864
|
+
interface OnChainAnchorConfig {
|
|
865
|
+
/** JSON-RPC URL for the target chain */
|
|
866
|
+
rpcUrl: string;
|
|
867
|
+
/** KontextAnchor contract address */
|
|
868
|
+
contractAddress: string;
|
|
869
|
+
/** Private key of the signer (hex with 0x prefix). Required for write operations. */
|
|
870
|
+
privateKey?: string;
|
|
871
|
+
}
|
|
872
|
+
/** Result of an on-chain anchor transaction */
|
|
873
|
+
interface AnchorResult {
|
|
874
|
+
/** The digest that was anchored */
|
|
875
|
+
digest: string;
|
|
876
|
+
/** The on-chain transaction hash */
|
|
877
|
+
txHash: string;
|
|
878
|
+
/** The block number containing the anchor */
|
|
879
|
+
blockNumber: number;
|
|
880
|
+
/** Block timestamp (unix seconds) */
|
|
881
|
+
timestamp: number;
|
|
882
|
+
/** Contract address used */
|
|
883
|
+
contractAddress: string;
|
|
884
|
+
/** Chain the anchor was submitted to */
|
|
885
|
+
chain: string;
|
|
886
|
+
}
|
|
887
|
+
/** Result of verifying an anchor on-chain */
|
|
888
|
+
interface AnchorVerification {
|
|
889
|
+
/** Whether the digest was found on-chain */
|
|
890
|
+
anchored: boolean;
|
|
891
|
+
/** The digest that was checked */
|
|
892
|
+
digest: string;
|
|
893
|
+
/** Anchorer address (if anchored) */
|
|
894
|
+
anchorer?: string;
|
|
895
|
+
/** Project hash (if anchored) */
|
|
896
|
+
projectHash?: string;
|
|
897
|
+
/** Block timestamp (if anchored) */
|
|
898
|
+
timestamp?: number;
|
|
899
|
+
}
|
|
900
|
+
/** Agent card served at /.well-known/kontext.json */
|
|
901
|
+
interface AgentCard {
|
|
902
|
+
/** Agent identifier */
|
|
903
|
+
agentId: string;
|
|
904
|
+
/** Kontext SDK version */
|
|
905
|
+
kontextVersion: string;
|
|
906
|
+
/** Supported capabilities (e.g., ['verify', 'attest']) */
|
|
907
|
+
capabilities: string[];
|
|
908
|
+
/** Attestation endpoint path (relative to host) */
|
|
909
|
+
attestEndpoint: string;
|
|
910
|
+
}
|
|
911
|
+
/** Counterparty configuration for verify() */
|
|
912
|
+
interface CounterpartyConfig {
|
|
913
|
+
/** Base URL of the counterparty agent (e.g., https://agent.example.com) */
|
|
914
|
+
endpoint: string;
|
|
915
|
+
/** Expected agent ID (optional, verified against agent card) */
|
|
916
|
+
agentId?: string;
|
|
917
|
+
/** Timeout for attestation exchange in milliseconds (default: 10000) */
|
|
918
|
+
timeoutMs?: number;
|
|
919
|
+
}
|
|
920
|
+
/** Attestation request sent to counterparty */
|
|
921
|
+
interface AttestationRequest {
|
|
922
|
+
/** Sender's terminal digest */
|
|
923
|
+
senderDigest: string;
|
|
924
|
+
/** Sender's agent ID */
|
|
925
|
+
senderAgentId: string;
|
|
926
|
+
/** Transaction hash */
|
|
927
|
+
txHash?: string;
|
|
928
|
+
/** Chain */
|
|
929
|
+
chain?: string;
|
|
930
|
+
/** Transfer amount */
|
|
931
|
+
amount: string;
|
|
932
|
+
/** Token */
|
|
933
|
+
token?: string;
|
|
934
|
+
/** Timestamp of the request */
|
|
935
|
+
timestamp: string;
|
|
936
|
+
}
|
|
937
|
+
/** Attestation response from counterparty */
|
|
938
|
+
interface AttestationResponse {
|
|
939
|
+
/** Whether the counterparty attested */
|
|
940
|
+
attested: boolean;
|
|
941
|
+
/** Counterparty's terminal digest */
|
|
942
|
+
receiverDigest: string;
|
|
943
|
+
/** Counterparty's agent ID */
|
|
944
|
+
receiverAgentId: string;
|
|
945
|
+
/** Timestamp of attestation */
|
|
946
|
+
timestamp: string;
|
|
947
|
+
}
|
|
948
|
+
/** Counterparty attestation result included in VerifyResult */
|
|
949
|
+
interface CounterpartyAttestation {
|
|
950
|
+
/** Whether the counterparty successfully attested */
|
|
951
|
+
attested: boolean;
|
|
952
|
+
/** Counterparty's digest (proof they ran compliance) */
|
|
953
|
+
digest: string;
|
|
954
|
+
/** Counterparty's agent ID */
|
|
955
|
+
agentId: string;
|
|
956
|
+
/** Attestation timestamp */
|
|
957
|
+
timestamp: string;
|
|
958
|
+
}
|
|
855
959
|
/** Error codes for Kontext SDK */
|
|
856
960
|
declare enum KontextErrorCode {
|
|
857
961
|
INITIALIZATION_ERROR = "INITIALIZATION_ERROR",
|
|
@@ -1837,6 +1941,57 @@ declare class PaymentCompliance {
|
|
|
1837
1941
|
private static generateRecommendations;
|
|
1838
1942
|
}
|
|
1839
1943
|
|
|
1944
|
+
/**
|
|
1945
|
+
* Verify whether a digest has been anchored on-chain.
|
|
1946
|
+
* Uses eth_call — no signing required, no dependencies.
|
|
1947
|
+
*/
|
|
1948
|
+
declare function verifyAnchor(rpcUrl: string, contractAddress: string, digest: string): Promise<AnchorVerification>;
|
|
1949
|
+
/**
|
|
1950
|
+
* Get full anchor details for a digest.
|
|
1951
|
+
* Returns null if the digest is not anchored.
|
|
1952
|
+
*/
|
|
1953
|
+
declare function getAnchor(rpcUrl: string, contractAddress: string, digest: string): Promise<{
|
|
1954
|
+
anchorer: string;
|
|
1955
|
+
projectHash: string;
|
|
1956
|
+
timestamp: number;
|
|
1957
|
+
} | null>;
|
|
1958
|
+
/**
|
|
1959
|
+
* Anchor a digest hash on-chain via the KontextAnchor contract.
|
|
1960
|
+
* Requires viem: `npm install viem`
|
|
1961
|
+
*/
|
|
1962
|
+
declare function anchorDigest(config: OnChainAnchorConfig, digest: string, projectId: string): Promise<AnchorResult>;
|
|
1963
|
+
/**
|
|
1964
|
+
* Exporter that anchors terminal digest hashes on Base chain.
|
|
1965
|
+
* Buffers events and anchors when batchSize is reached.
|
|
1966
|
+
*/
|
|
1967
|
+
declare class OnChainExporter implements EventExporter {
|
|
1968
|
+
private readonly config;
|
|
1969
|
+
private readonly projectId;
|
|
1970
|
+
private readonly batchSize;
|
|
1971
|
+
private readonly getTerminalDigest;
|
|
1972
|
+
private eventCount;
|
|
1973
|
+
constructor(config: OnChainAnchorConfig, projectId: string, getTerminalDigest: () => string);
|
|
1974
|
+
export(events: ActionLog[]): Promise<ExporterResult>;
|
|
1975
|
+
flush(): Promise<void>;
|
|
1976
|
+
shutdown(): Promise<void>;
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
/**
|
|
1980
|
+
* Fetch the counterparty's agent card from /.well-known/kontext.json
|
|
1981
|
+
*/
|
|
1982
|
+
declare function fetchAgentCard(endpoint: string, timeoutMs?: number): Promise<AgentCard>;
|
|
1983
|
+
/**
|
|
1984
|
+
* Exchange compliance attestation with a counterparty agent.
|
|
1985
|
+
*
|
|
1986
|
+
* Flow:
|
|
1987
|
+
* 1. Fetch counterparty's agent card from /.well-known/kontext.json
|
|
1988
|
+
* 2. Validate agent ID if specified
|
|
1989
|
+
* 3. Verify counterparty supports attestation
|
|
1990
|
+
* 4. POST attestation request to counterparty's attest endpoint
|
|
1991
|
+
* 5. Return counterparty's attestation response
|
|
1992
|
+
*/
|
|
1993
|
+
declare function exchangeAttestation(config: CounterpartyConfig, request: AttestationRequest): Promise<CounterpartyAttestation>;
|
|
1994
|
+
|
|
1840
1995
|
/**
|
|
1841
1996
|
* In-memory data store for the Kontext SDK.
|
|
1842
1997
|
* Holds all action logs, transactions, tasks, and anomaly events.
|
|
@@ -2182,4 +2337,4 @@ declare class AnomalyDetector {
|
|
|
2182
2337
|
private notifyCallbacks;
|
|
2183
2338
|
}
|
|
2184
2339
|
|
|
2185
|
-
export { type ActionLog, type AgentData, type AnomalyCallback, type AnomalyDetectionConfig, AnomalyDetector, type AnomalyEvent, type AnomalyRuleType, type AnomalySeverity, type AnomalyThresholds, type Chain, type ComplianceCertificate, type ComplianceCheckResult, type ComplianceReport, type ConfirmTaskInput, ConsoleExporter, type CreateTaskInput, type DateRange, DigestChain, type DigestLink, type DigestVerification, type Environment, type EventExporter, type ExportFormat, type ExportOptions, type ExportResult, type ExporterResult, type FeatureFlag, type FeatureFlagConfig, FeatureFlagManager, FileStorage, type FlagPlanTargeting, type FlagScope, type FlagTargeting, type GatedFeature, type GenerateComplianceCertificateInput, JsonFileExporter, Kontext, type KontextConfig, KontextError, KontextErrorCode, type KontextMode, type LimitEvent, type LogActionInput, type LogLevel, type LogReasoningInput, type LogTransactionInput, MemoryStorage, type MetadataValidator, NoopExporter, PLAN_LIMITS, PaymentCompliance, type PlanConfig, PlanManager, type PlanTier, type PlanUsage, type PrecisionTimestamp, type ReasoningEntry, type ReportOptions, type ReportType, type RiskFactor, type SanctionsCheckResult, type StorageAdapter, type Task, type TaskEvidence, type TaskStatus, type Token, type TransactionEvaluation, type TransactionRecord, type TrustFactor, type TrustScore, TrustScorer, UsdcCompliance, type UsdcComplianceCheck, type VerifyInput, type VerifyResult, isCryptoTransaction, isFeatureAvailable, requirePlan, verifyExportedChain };
|
|
2340
|
+
export { type ActionLog, type AgentCard, type AgentData, type AnchorResult, type AnchorVerification, type AnomalyCallback, type AnomalyDetectionConfig, AnomalyDetector, type AnomalyEvent, type AnomalyRuleType, type AnomalySeverity, type AnomalyThresholds, type AttestationRequest, type AttestationResponse, type Chain, type ComplianceCertificate, type ComplianceCheckResult, type ComplianceReport, type ConfirmTaskInput, ConsoleExporter, type CounterpartyAttestation, type CounterpartyConfig, type CreateTaskInput, type DateRange, DigestChain, type DigestLink, type DigestVerification, type Environment, type EventExporter, type ExportFormat, type ExportOptions, type ExportResult, type ExporterResult, type FeatureFlag, type FeatureFlagConfig, FeatureFlagManager, FileStorage, type FlagPlanTargeting, type FlagScope, type FlagTargeting, type GatedFeature, type GenerateComplianceCertificateInput, JsonFileExporter, Kontext, type KontextConfig, KontextError, KontextErrorCode, type KontextMode, type LimitEvent, type LogActionInput, type LogLevel, type LogReasoningInput, type LogTransactionInput, MemoryStorage, type MetadataValidator, NoopExporter, type OnChainAnchorConfig, OnChainExporter, PLAN_LIMITS, PaymentCompliance, type PlanConfig, PlanManager, type PlanTier, type PlanUsage, type PrecisionTimestamp, type ReasoningEntry, type ReportOptions, type ReportType, type RiskFactor, type SanctionsCheckResult, type StorageAdapter, type Task, type TaskEvidence, type TaskStatus, type Token, type TransactionEvaluation, type TransactionRecord, type TrustFactor, type TrustScore, TrustScorer, UsdcCompliance, type UsdcComplianceCheck, type VerifyInput, type VerifyResult, anchorDigest, exchangeAttestation, fetchAgentCard, getAnchor, isCryptoTransaction, isFeatureAvailable, requirePlan, verifyAnchor, verifyExportedChain };
|
package/dist/index.d.ts
CHANGED
|
@@ -765,6 +765,10 @@ interface VerifyInput extends LogTransactionInput {
|
|
|
765
765
|
confidence?: number;
|
|
766
766
|
/** Additional reasoning context */
|
|
767
767
|
context?: Record<string, unknown>;
|
|
768
|
+
/** When provided, anchors the terminal digest on-chain after compliance checks */
|
|
769
|
+
anchor?: OnChainAnchorConfig;
|
|
770
|
+
/** Counterparty agent for bilateral A2A attestation exchange */
|
|
771
|
+
counterparty?: CounterpartyConfig;
|
|
768
772
|
}
|
|
769
773
|
/** Result of the verify() convenience method */
|
|
770
774
|
interface VerifyResult {
|
|
@@ -790,6 +794,10 @@ interface VerifyResult {
|
|
|
790
794
|
};
|
|
791
795
|
/** Reasoning entry ID (present when reasoning was provided in input) */
|
|
792
796
|
reasoningId?: string;
|
|
797
|
+
/** On-chain anchor proof (present when anchor config provided in input) */
|
|
798
|
+
anchorProof?: AnchorResult;
|
|
799
|
+
/** Counterparty attestation (present when counterparty config provided in input) */
|
|
800
|
+
counterparty?: CounterpartyAttestation;
|
|
793
801
|
/** True when the transaction amount exceeds the approvalThreshold */
|
|
794
802
|
requiresApproval?: boolean;
|
|
795
803
|
/** The pending approval task (present when requiresApproval is true) */
|
|
@@ -852,6 +860,102 @@ interface ReasoningEntry {
|
|
|
852
860
|
/** Context */
|
|
853
861
|
context: Record<string, unknown>;
|
|
854
862
|
}
|
|
863
|
+
/** Configuration for on-chain digest anchoring */
|
|
864
|
+
interface OnChainAnchorConfig {
|
|
865
|
+
/** JSON-RPC URL for the target chain */
|
|
866
|
+
rpcUrl: string;
|
|
867
|
+
/** KontextAnchor contract address */
|
|
868
|
+
contractAddress: string;
|
|
869
|
+
/** Private key of the signer (hex with 0x prefix). Required for write operations. */
|
|
870
|
+
privateKey?: string;
|
|
871
|
+
}
|
|
872
|
+
/** Result of an on-chain anchor transaction */
|
|
873
|
+
interface AnchorResult {
|
|
874
|
+
/** The digest that was anchored */
|
|
875
|
+
digest: string;
|
|
876
|
+
/** The on-chain transaction hash */
|
|
877
|
+
txHash: string;
|
|
878
|
+
/** The block number containing the anchor */
|
|
879
|
+
blockNumber: number;
|
|
880
|
+
/** Block timestamp (unix seconds) */
|
|
881
|
+
timestamp: number;
|
|
882
|
+
/** Contract address used */
|
|
883
|
+
contractAddress: string;
|
|
884
|
+
/** Chain the anchor was submitted to */
|
|
885
|
+
chain: string;
|
|
886
|
+
}
|
|
887
|
+
/** Result of verifying an anchor on-chain */
|
|
888
|
+
interface AnchorVerification {
|
|
889
|
+
/** Whether the digest was found on-chain */
|
|
890
|
+
anchored: boolean;
|
|
891
|
+
/** The digest that was checked */
|
|
892
|
+
digest: string;
|
|
893
|
+
/** Anchorer address (if anchored) */
|
|
894
|
+
anchorer?: string;
|
|
895
|
+
/** Project hash (if anchored) */
|
|
896
|
+
projectHash?: string;
|
|
897
|
+
/** Block timestamp (if anchored) */
|
|
898
|
+
timestamp?: number;
|
|
899
|
+
}
|
|
900
|
+
/** Agent card served at /.well-known/kontext.json */
|
|
901
|
+
interface AgentCard {
|
|
902
|
+
/** Agent identifier */
|
|
903
|
+
agentId: string;
|
|
904
|
+
/** Kontext SDK version */
|
|
905
|
+
kontextVersion: string;
|
|
906
|
+
/** Supported capabilities (e.g., ['verify', 'attest']) */
|
|
907
|
+
capabilities: string[];
|
|
908
|
+
/** Attestation endpoint path (relative to host) */
|
|
909
|
+
attestEndpoint: string;
|
|
910
|
+
}
|
|
911
|
+
/** Counterparty configuration for verify() */
|
|
912
|
+
interface CounterpartyConfig {
|
|
913
|
+
/** Base URL of the counterparty agent (e.g., https://agent.example.com) */
|
|
914
|
+
endpoint: string;
|
|
915
|
+
/** Expected agent ID (optional, verified against agent card) */
|
|
916
|
+
agentId?: string;
|
|
917
|
+
/** Timeout for attestation exchange in milliseconds (default: 10000) */
|
|
918
|
+
timeoutMs?: number;
|
|
919
|
+
}
|
|
920
|
+
/** Attestation request sent to counterparty */
|
|
921
|
+
interface AttestationRequest {
|
|
922
|
+
/** Sender's terminal digest */
|
|
923
|
+
senderDigest: string;
|
|
924
|
+
/** Sender's agent ID */
|
|
925
|
+
senderAgentId: string;
|
|
926
|
+
/** Transaction hash */
|
|
927
|
+
txHash?: string;
|
|
928
|
+
/** Chain */
|
|
929
|
+
chain?: string;
|
|
930
|
+
/** Transfer amount */
|
|
931
|
+
amount: string;
|
|
932
|
+
/** Token */
|
|
933
|
+
token?: string;
|
|
934
|
+
/** Timestamp of the request */
|
|
935
|
+
timestamp: string;
|
|
936
|
+
}
|
|
937
|
+
/** Attestation response from counterparty */
|
|
938
|
+
interface AttestationResponse {
|
|
939
|
+
/** Whether the counterparty attested */
|
|
940
|
+
attested: boolean;
|
|
941
|
+
/** Counterparty's terminal digest */
|
|
942
|
+
receiverDigest: string;
|
|
943
|
+
/** Counterparty's agent ID */
|
|
944
|
+
receiverAgentId: string;
|
|
945
|
+
/** Timestamp of attestation */
|
|
946
|
+
timestamp: string;
|
|
947
|
+
}
|
|
948
|
+
/** Counterparty attestation result included in VerifyResult */
|
|
949
|
+
interface CounterpartyAttestation {
|
|
950
|
+
/** Whether the counterparty successfully attested */
|
|
951
|
+
attested: boolean;
|
|
952
|
+
/** Counterparty's digest (proof they ran compliance) */
|
|
953
|
+
digest: string;
|
|
954
|
+
/** Counterparty's agent ID */
|
|
955
|
+
agentId: string;
|
|
956
|
+
/** Attestation timestamp */
|
|
957
|
+
timestamp: string;
|
|
958
|
+
}
|
|
855
959
|
/** Error codes for Kontext SDK */
|
|
856
960
|
declare enum KontextErrorCode {
|
|
857
961
|
INITIALIZATION_ERROR = "INITIALIZATION_ERROR",
|
|
@@ -1837,6 +1941,57 @@ declare class PaymentCompliance {
|
|
|
1837
1941
|
private static generateRecommendations;
|
|
1838
1942
|
}
|
|
1839
1943
|
|
|
1944
|
+
/**
|
|
1945
|
+
* Verify whether a digest has been anchored on-chain.
|
|
1946
|
+
* Uses eth_call — no signing required, no dependencies.
|
|
1947
|
+
*/
|
|
1948
|
+
declare function verifyAnchor(rpcUrl: string, contractAddress: string, digest: string): Promise<AnchorVerification>;
|
|
1949
|
+
/**
|
|
1950
|
+
* Get full anchor details for a digest.
|
|
1951
|
+
* Returns null if the digest is not anchored.
|
|
1952
|
+
*/
|
|
1953
|
+
declare function getAnchor(rpcUrl: string, contractAddress: string, digest: string): Promise<{
|
|
1954
|
+
anchorer: string;
|
|
1955
|
+
projectHash: string;
|
|
1956
|
+
timestamp: number;
|
|
1957
|
+
} | null>;
|
|
1958
|
+
/**
|
|
1959
|
+
* Anchor a digest hash on-chain via the KontextAnchor contract.
|
|
1960
|
+
* Requires viem: `npm install viem`
|
|
1961
|
+
*/
|
|
1962
|
+
declare function anchorDigest(config: OnChainAnchorConfig, digest: string, projectId: string): Promise<AnchorResult>;
|
|
1963
|
+
/**
|
|
1964
|
+
* Exporter that anchors terminal digest hashes on Base chain.
|
|
1965
|
+
* Buffers events and anchors when batchSize is reached.
|
|
1966
|
+
*/
|
|
1967
|
+
declare class OnChainExporter implements EventExporter {
|
|
1968
|
+
private readonly config;
|
|
1969
|
+
private readonly projectId;
|
|
1970
|
+
private readonly batchSize;
|
|
1971
|
+
private readonly getTerminalDigest;
|
|
1972
|
+
private eventCount;
|
|
1973
|
+
constructor(config: OnChainAnchorConfig, projectId: string, getTerminalDigest: () => string);
|
|
1974
|
+
export(events: ActionLog[]): Promise<ExporterResult>;
|
|
1975
|
+
flush(): Promise<void>;
|
|
1976
|
+
shutdown(): Promise<void>;
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
/**
|
|
1980
|
+
* Fetch the counterparty's agent card from /.well-known/kontext.json
|
|
1981
|
+
*/
|
|
1982
|
+
declare function fetchAgentCard(endpoint: string, timeoutMs?: number): Promise<AgentCard>;
|
|
1983
|
+
/**
|
|
1984
|
+
* Exchange compliance attestation with a counterparty agent.
|
|
1985
|
+
*
|
|
1986
|
+
* Flow:
|
|
1987
|
+
* 1. Fetch counterparty's agent card from /.well-known/kontext.json
|
|
1988
|
+
* 2. Validate agent ID if specified
|
|
1989
|
+
* 3. Verify counterparty supports attestation
|
|
1990
|
+
* 4. POST attestation request to counterparty's attest endpoint
|
|
1991
|
+
* 5. Return counterparty's attestation response
|
|
1992
|
+
*/
|
|
1993
|
+
declare function exchangeAttestation(config: CounterpartyConfig, request: AttestationRequest): Promise<CounterpartyAttestation>;
|
|
1994
|
+
|
|
1840
1995
|
/**
|
|
1841
1996
|
* In-memory data store for the Kontext SDK.
|
|
1842
1997
|
* Holds all action logs, transactions, tasks, and anomaly events.
|
|
@@ -2182,4 +2337,4 @@ declare class AnomalyDetector {
|
|
|
2182
2337
|
private notifyCallbacks;
|
|
2183
2338
|
}
|
|
2184
2339
|
|
|
2185
|
-
export { type ActionLog, type AgentData, type AnomalyCallback, type AnomalyDetectionConfig, AnomalyDetector, type AnomalyEvent, type AnomalyRuleType, type AnomalySeverity, type AnomalyThresholds, type Chain, type ComplianceCertificate, type ComplianceCheckResult, type ComplianceReport, type ConfirmTaskInput, ConsoleExporter, type CreateTaskInput, type DateRange, DigestChain, type DigestLink, type DigestVerification, type Environment, type EventExporter, type ExportFormat, type ExportOptions, type ExportResult, type ExporterResult, type FeatureFlag, type FeatureFlagConfig, FeatureFlagManager, FileStorage, type FlagPlanTargeting, type FlagScope, type FlagTargeting, type GatedFeature, type GenerateComplianceCertificateInput, JsonFileExporter, Kontext, type KontextConfig, KontextError, KontextErrorCode, type KontextMode, type LimitEvent, type LogActionInput, type LogLevel, type LogReasoningInput, type LogTransactionInput, MemoryStorage, type MetadataValidator, NoopExporter, PLAN_LIMITS, PaymentCompliance, type PlanConfig, PlanManager, type PlanTier, type PlanUsage, type PrecisionTimestamp, type ReasoningEntry, type ReportOptions, type ReportType, type RiskFactor, type SanctionsCheckResult, type StorageAdapter, type Task, type TaskEvidence, type TaskStatus, type Token, type TransactionEvaluation, type TransactionRecord, type TrustFactor, type TrustScore, TrustScorer, UsdcCompliance, type UsdcComplianceCheck, type VerifyInput, type VerifyResult, isCryptoTransaction, isFeatureAvailable, requirePlan, verifyExportedChain };
|
|
2340
|
+
export { type ActionLog, type AgentCard, type AgentData, type AnchorResult, type AnchorVerification, type AnomalyCallback, type AnomalyDetectionConfig, AnomalyDetector, type AnomalyEvent, type AnomalyRuleType, type AnomalySeverity, type AnomalyThresholds, type AttestationRequest, type AttestationResponse, type Chain, type ComplianceCertificate, type ComplianceCheckResult, type ComplianceReport, type ConfirmTaskInput, ConsoleExporter, type CounterpartyAttestation, type CounterpartyConfig, type CreateTaskInput, type DateRange, DigestChain, type DigestLink, type DigestVerification, type Environment, type EventExporter, type ExportFormat, type ExportOptions, type ExportResult, type ExporterResult, type FeatureFlag, type FeatureFlagConfig, FeatureFlagManager, FileStorage, type FlagPlanTargeting, type FlagScope, type FlagTargeting, type GatedFeature, type GenerateComplianceCertificateInput, JsonFileExporter, Kontext, type KontextConfig, KontextError, KontextErrorCode, type KontextMode, type LimitEvent, type LogActionInput, type LogLevel, type LogReasoningInput, type LogTransactionInput, MemoryStorage, type MetadataValidator, NoopExporter, type OnChainAnchorConfig, OnChainExporter, PLAN_LIMITS, PaymentCompliance, type PlanConfig, PlanManager, type PlanTier, type PlanUsage, type PrecisionTimestamp, type ReasoningEntry, type ReportOptions, type ReportType, type RiskFactor, type SanctionsCheckResult, type StorageAdapter, type Task, type TaskEvidence, type TaskStatus, type Token, type TransactionEvaluation, type TransactionRecord, type TrustFactor, type TrustScore, TrustScorer, UsdcCompliance, type UsdcComplianceCheck, type VerifyInput, type VerifyResult, anchorDigest, exchangeAttestation, fetchAgentCard, getAnchor, isCryptoTransaction, isFeatureAvailable, requirePlan, verifyAnchor, verifyExportedChain };
|
package/dist/index.js
CHANGED
|
@@ -25,12 +25,229 @@ function _interopNamespace(e) {
|
|
|
25
25
|
var fs4__namespace = /*#__PURE__*/_interopNamespace(fs4);
|
|
26
26
|
var path4__namespace = /*#__PURE__*/_interopNamespace(path4);
|
|
27
27
|
|
|
28
|
+
var __defProp = Object.defineProperty;
|
|
29
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
28
30
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
29
31
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
30
32
|
}) : x)(function(x) {
|
|
31
33
|
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
32
34
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
33
35
|
});
|
|
36
|
+
var __esm = (fn, res) => function __init() {
|
|
37
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
38
|
+
};
|
|
39
|
+
var __export = (target, all) => {
|
|
40
|
+
for (var name in all)
|
|
41
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/onchain.ts
|
|
45
|
+
var onchain_exports = {};
|
|
46
|
+
__export(onchain_exports, {
|
|
47
|
+
OnChainExporter: () => exports.OnChainExporter,
|
|
48
|
+
anchorDigest: () => anchorDigest,
|
|
49
|
+
getAnchor: () => getAnchor,
|
|
50
|
+
verifyAnchor: () => verifyAnchor
|
|
51
|
+
});
|
|
52
|
+
async function rpcCall(rpcUrl, method, params) {
|
|
53
|
+
const res = await fetch(rpcUrl, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "Content-Type": "application/json" },
|
|
56
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params })
|
|
57
|
+
});
|
|
58
|
+
const json = await res.json();
|
|
59
|
+
if (json.error) throw new Error(`RPC error: ${json.error.message}`);
|
|
60
|
+
return json.result;
|
|
61
|
+
}
|
|
62
|
+
function encodeBytes32(hex) {
|
|
63
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
64
|
+
return clean.padStart(64, "0");
|
|
65
|
+
}
|
|
66
|
+
function decodeUint256(hex) {
|
|
67
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
68
|
+
return parseInt(clean, 16);
|
|
69
|
+
}
|
|
70
|
+
function decodeAddress(hex) {
|
|
71
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
72
|
+
return "0x" + clean.slice(24);
|
|
73
|
+
}
|
|
74
|
+
async function verifyAnchor(rpcUrl, contractAddress, digest) {
|
|
75
|
+
const calldata = SEL_VERIFY + encodeBytes32(digest);
|
|
76
|
+
const result = await rpcCall(rpcUrl, "eth_call", [
|
|
77
|
+
{ to: contractAddress, data: calldata },
|
|
78
|
+
"latest"
|
|
79
|
+
]);
|
|
80
|
+
const anchored = decodeUint256(result) !== 0;
|
|
81
|
+
return { anchored, digest };
|
|
82
|
+
}
|
|
83
|
+
async function getAnchor(rpcUrl, contractAddress, digest) {
|
|
84
|
+
const calldata = SEL_GET_ANCHOR + encodeBytes32(digest);
|
|
85
|
+
try {
|
|
86
|
+
const result = await rpcCall(rpcUrl, "eth_call", [
|
|
87
|
+
{ to: contractAddress, data: calldata },
|
|
88
|
+
"latest"
|
|
89
|
+
]);
|
|
90
|
+
const clean = result.startsWith("0x") ? result.slice(2) : result;
|
|
91
|
+
if (clean.length < 192) return null;
|
|
92
|
+
const anchorer = decodeAddress(clean.slice(0, 64));
|
|
93
|
+
const projectHash = "0x" + clean.slice(64, 128);
|
|
94
|
+
const timestamp = decodeUint256("0x" + clean.slice(128, 192));
|
|
95
|
+
return { anchorer, projectHash, timestamp };
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function anchorDigest(config, digest, projectId) {
|
|
101
|
+
let viem;
|
|
102
|
+
let viemChains;
|
|
103
|
+
let viemAccounts;
|
|
104
|
+
try {
|
|
105
|
+
viem = await import('viem');
|
|
106
|
+
viemChains = await import('viem/chains');
|
|
107
|
+
viemAccounts = await import('viem/accounts');
|
|
108
|
+
} catch {
|
|
109
|
+
throw new Error(
|
|
110
|
+
"On-chain anchoring requires viem. Install it: npm install viem"
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
if (!config.privateKey) {
|
|
114
|
+
throw new Error("privateKey is required for on-chain anchoring");
|
|
115
|
+
}
|
|
116
|
+
const account = viemAccounts.privateKeyToAccount(config.privateKey);
|
|
117
|
+
const chain = config.rpcUrl.includes("sepolia") ? viemChains.baseSepolia : viemChains.base;
|
|
118
|
+
const client = viem.createWalletClient({
|
|
119
|
+
account,
|
|
120
|
+
chain,
|
|
121
|
+
transport: viem.http(config.rpcUrl)
|
|
122
|
+
});
|
|
123
|
+
const publicClient = viem.createPublicClient({
|
|
124
|
+
chain,
|
|
125
|
+
transport: viem.http(config.rpcUrl)
|
|
126
|
+
});
|
|
127
|
+
const projectHash = viem.keccak256(viem.toBytes(projectId));
|
|
128
|
+
const digestBytes32 = digest.startsWith("0x") ? digest : `0x${digest}`;
|
|
129
|
+
const abi = [
|
|
130
|
+
{
|
|
131
|
+
name: "anchor",
|
|
132
|
+
type: "function",
|
|
133
|
+
stateMutability: "nonpayable",
|
|
134
|
+
inputs: [
|
|
135
|
+
{ name: "digest", type: "bytes32" },
|
|
136
|
+
{ name: "projectHash", type: "bytes32" }
|
|
137
|
+
],
|
|
138
|
+
outputs: []
|
|
139
|
+
}
|
|
140
|
+
];
|
|
141
|
+
const txHash = await client.writeContract({
|
|
142
|
+
address: config.contractAddress,
|
|
143
|
+
abi,
|
|
144
|
+
functionName: "anchor",
|
|
145
|
+
args: [digestBytes32, projectHash]
|
|
146
|
+
});
|
|
147
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
148
|
+
return {
|
|
149
|
+
digest,
|
|
150
|
+
txHash,
|
|
151
|
+
blockNumber: Number(receipt.blockNumber),
|
|
152
|
+
timestamp: Math.floor(Date.now() / 1e3),
|
|
153
|
+
contractAddress: config.contractAddress,
|
|
154
|
+
chain: chain.name.toLowerCase()
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
var SEL_VERIFY, SEL_GET_ANCHOR; exports.OnChainExporter = void 0;
|
|
158
|
+
var init_onchain = __esm({
|
|
159
|
+
"src/onchain.ts"() {
|
|
160
|
+
SEL_VERIFY = "0x75e36616";
|
|
161
|
+
SEL_GET_ANCHOR = "0x7feb51d9";
|
|
162
|
+
exports.OnChainExporter = class {
|
|
163
|
+
config;
|
|
164
|
+
projectId;
|
|
165
|
+
batchSize;
|
|
166
|
+
getTerminalDigest;
|
|
167
|
+
eventCount = 0;
|
|
168
|
+
constructor(config, projectId, getTerminalDigest) {
|
|
169
|
+
this.config = config;
|
|
170
|
+
this.projectId = projectId;
|
|
171
|
+
this.batchSize = 10;
|
|
172
|
+
this.getTerminalDigest = getTerminalDigest;
|
|
173
|
+
}
|
|
174
|
+
async export(events) {
|
|
175
|
+
this.eventCount += events.length;
|
|
176
|
+
if (this.eventCount >= this.batchSize) {
|
|
177
|
+
const digest = this.getTerminalDigest();
|
|
178
|
+
await anchorDigest(this.config, digest, this.projectId);
|
|
179
|
+
this.eventCount = 0;
|
|
180
|
+
}
|
|
181
|
+
return { success: true, exportedCount: events.length };
|
|
182
|
+
}
|
|
183
|
+
async flush() {
|
|
184
|
+
if (this.eventCount > 0) {
|
|
185
|
+
const digest = this.getTerminalDigest();
|
|
186
|
+
await anchorDigest(this.config, digest, this.projectId);
|
|
187
|
+
this.eventCount = 0;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async shutdown() {
|
|
191
|
+
await this.flush();
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// src/attestation.ts
|
|
198
|
+
var attestation_exports = {};
|
|
199
|
+
__export(attestation_exports, {
|
|
200
|
+
exchangeAttestation: () => exchangeAttestation,
|
|
201
|
+
fetchAgentCard: () => fetchAgentCard
|
|
202
|
+
});
|
|
203
|
+
async function fetchAgentCard(endpoint, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
204
|
+
const url = `${endpoint.replace(/\/$/, "")}/.well-known/kontext.json`;
|
|
205
|
+
const response = await fetch(url, {
|
|
206
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
207
|
+
headers: { Accept: "application/json" }
|
|
208
|
+
});
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
throw new Error(`Failed to fetch agent card from ${url}: ${response.status}`);
|
|
211
|
+
}
|
|
212
|
+
return response.json();
|
|
213
|
+
}
|
|
214
|
+
async function exchangeAttestation(config, request) {
|
|
215
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
216
|
+
const card = await fetchAgentCard(config.endpoint, timeoutMs);
|
|
217
|
+
if (config.agentId && card.agentId !== config.agentId) {
|
|
218
|
+
throw new Error(
|
|
219
|
+
`Agent ID mismatch: expected ${config.agentId}, got ${card.agentId}`
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
if (!card.capabilities.includes("attest")) {
|
|
223
|
+
throw new Error(
|
|
224
|
+
`Counterparty ${card.agentId} does not support attestation`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
const attestUrl = `${config.endpoint.replace(/\/$/, "")}${card.attestEndpoint}`;
|
|
228
|
+
const response = await fetch(attestUrl, {
|
|
229
|
+
method: "POST",
|
|
230
|
+
headers: { "Content-Type": "application/json" },
|
|
231
|
+
body: JSON.stringify(request),
|
|
232
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
233
|
+
});
|
|
234
|
+
if (!response.ok) {
|
|
235
|
+
throw new Error(`Attestation request failed: ${response.status}`);
|
|
236
|
+
}
|
|
237
|
+
const result = await response.json();
|
|
238
|
+
return {
|
|
239
|
+
attested: result.attested,
|
|
240
|
+
digest: result.receiverDigest,
|
|
241
|
+
agentId: result.receiverAgentId,
|
|
242
|
+
timestamp: result.timestamp
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
var DEFAULT_TIMEOUT_MS;
|
|
246
|
+
var init_attestation = __esm({
|
|
247
|
+
"src/attestation.ts"() {
|
|
248
|
+
DEFAULT_TIMEOUT_MS = 1e4;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
34
251
|
|
|
35
252
|
// src/utils.ts
|
|
36
253
|
function generateId() {
|
|
@@ -3778,6 +3995,24 @@ var Kontext = class _Kontext {
|
|
|
3778
3995
|
const verification = this.verifyDigestChain();
|
|
3779
3996
|
const chainLength = this.logger.getDigestChain().getChainLength();
|
|
3780
3997
|
const terminalDigest = this.getTerminalDigest();
|
|
3998
|
+
let anchorProof;
|
|
3999
|
+
if (input.anchor) {
|
|
4000
|
+
const { anchorDigest: anchorDigest2 } = await Promise.resolve().then(() => (init_onchain(), onchain_exports));
|
|
4001
|
+
anchorProof = await anchorDigest2(input.anchor, terminalDigest, this.config.projectId);
|
|
4002
|
+
}
|
|
4003
|
+
let counterpartyResult;
|
|
4004
|
+
if (input.counterparty) {
|
|
4005
|
+
const { exchangeAttestation: exchangeAttestation2 } = await Promise.resolve().then(() => (init_attestation(), attestation_exports));
|
|
4006
|
+
counterpartyResult = await exchangeAttestation2(input.counterparty, {
|
|
4007
|
+
senderDigest: terminalDigest,
|
|
4008
|
+
senderAgentId: input.agentId,
|
|
4009
|
+
txHash: input.txHash,
|
|
4010
|
+
chain: input.chain,
|
|
4011
|
+
amount: input.amount,
|
|
4012
|
+
token: input.token,
|
|
4013
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
4014
|
+
});
|
|
4015
|
+
}
|
|
3781
4016
|
let requiresApproval;
|
|
3782
4017
|
let task;
|
|
3783
4018
|
if (this.config.approvalThreshold) {
|
|
@@ -3819,7 +4054,9 @@ var Kontext = class _Kontext {
|
|
|
3819
4054
|
valid: verification.valid
|
|
3820
4055
|
},
|
|
3821
4056
|
...reasoningId ? { reasoningId } : {},
|
|
3822
|
-
...requiresApproval ? { requiresApproval, task } : {}
|
|
4057
|
+
...requiresApproval ? { requiresApproval, task } : {},
|
|
4058
|
+
...anchorProof ? { anchorProof } : {},
|
|
4059
|
+
...counterpartyResult ? { counterparty: counterpartyResult } : {}
|
|
3823
4060
|
};
|
|
3824
4061
|
}
|
|
3825
4062
|
// --------------------------------------------------------------------------
|
|
@@ -4200,6 +4437,10 @@ var FileStorage = class {
|
|
|
4200
4437
|
}
|
|
4201
4438
|
};
|
|
4202
4439
|
|
|
4440
|
+
// src/index.ts
|
|
4441
|
+
init_onchain();
|
|
4442
|
+
init_attestation();
|
|
4443
|
+
|
|
4203
4444
|
exports.AnomalyDetector = AnomalyDetector;
|
|
4204
4445
|
exports.ConsoleExporter = ConsoleExporter;
|
|
4205
4446
|
exports.DigestChain = DigestChain;
|
|
@@ -4216,9 +4457,14 @@ exports.PaymentCompliance = PaymentCompliance;
|
|
|
4216
4457
|
exports.PlanManager = PlanManager;
|
|
4217
4458
|
exports.TrustScorer = TrustScorer;
|
|
4218
4459
|
exports.UsdcCompliance = UsdcCompliance;
|
|
4460
|
+
exports.anchorDigest = anchorDigest;
|
|
4461
|
+
exports.exchangeAttestation = exchangeAttestation;
|
|
4462
|
+
exports.fetchAgentCard = fetchAgentCard;
|
|
4463
|
+
exports.getAnchor = getAnchor;
|
|
4219
4464
|
exports.isCryptoTransaction = isCryptoTransaction;
|
|
4220
4465
|
exports.isFeatureAvailable = isFeatureAvailable;
|
|
4221
4466
|
exports.requirePlan = requirePlan;
|
|
4467
|
+
exports.verifyAnchor = verifyAnchor;
|
|
4222
4468
|
exports.verifyExportedChain = verifyExportedChain;
|
|
4223
4469
|
//# sourceMappingURL=index.js.map
|
|
4224
4470
|
//# sourceMappingURL=index.js.map
|