@framers/agentos-ext-anchor-providers 1.1.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/CHANGELOG.md +16 -0
- package/README.md +353 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/EthereumProvider.d.ts +36 -0
- package/dist/providers/EthereumProvider.d.ts.map +1 -0
- package/dist/providers/EthereumProvider.js +66 -0
- package/dist/providers/EthereumProvider.js.map +1 -0
- package/dist/providers/OpenTimestampsProvider.d.ts +28 -0
- package/dist/providers/OpenTimestampsProvider.d.ts.map +1 -0
- package/dist/providers/OpenTimestampsProvider.js +72 -0
- package/dist/providers/OpenTimestampsProvider.js.map +1 -0
- package/dist/providers/RekorProvider.d.ts +28 -0
- package/dist/providers/RekorProvider.d.ts.map +1 -0
- package/dist/providers/RekorProvider.js +68 -0
- package/dist/providers/RekorProvider.js.map +1 -0
- package/dist/providers/SolanaProvider.d.ts +62 -0
- package/dist/providers/SolanaProvider.d.ts.map +1 -0
- package/dist/providers/SolanaProvider.js +256 -0
- package/dist/providers/SolanaProvider.js.map +1 -0
- package/dist/providers/WormSnapshotProvider.d.ts +35 -0
- package/dist/providers/WormSnapshotProvider.d.ts.map +1 -0
- package/dist/providers/WormSnapshotProvider.js +64 -0
- package/dist/providers/WormSnapshotProvider.js.map +1 -0
- package/dist/register.d.ts +31 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +47 -0
- package/dist/register.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/http-client.d.ts +23 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +53 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/serialization.d.ts +16 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +30 -0
- package/dist/utils/serialization.js.map +1 -0
- package/manifest.json +100 -0
- package/package.json +103 -0
- package/src/index.ts +59 -0
- package/src/providers/EthereumProvider.ts +87 -0
- package/src/providers/OpenTimestampsProvider.ts +86 -0
- package/src/providers/RekorProvider.ts +82 -0
- package/src/providers/SolanaProvider.ts +439 -0
- package/src/providers/WormSnapshotProvider.ts +84 -0
- package/src/register.ts +69 -0
- package/src/types.ts +27 -0
- package/src/utils/http-client.ts +75 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/serialization.ts +33 -0
- package/test/integration.spec.ts +175 -0
- package/test/providers.spec.ts +163 -0
- package/test/register.spec.ts +69 -0
- package/test/types.spec.ts +55 -0
- package/test/utils.spec.ts +225 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file OpenTimestampsProvider.ts
|
|
3
|
+
* @description Bitcoin-anchored timestamping via the OpenTimestamps protocol.
|
|
4
|
+
* Creates OTS timestamps for anchor Merkle roots and submits to calendar servers.
|
|
5
|
+
*
|
|
6
|
+
* Proof level: `publicly-timestamped`
|
|
7
|
+
* Required peer dependency: `opentimestamps`
|
|
8
|
+
*
|
|
9
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
10
|
+
*/
|
|
11
|
+
import { resolveBaseConfig } from '../types.js';
|
|
12
|
+
import { hashCanonicalAnchor } from '../utils/serialization.js';
|
|
13
|
+
const DEFAULT_CALENDAR_URLS = [
|
|
14
|
+
'https://a.pool.opentimestamps.org',
|
|
15
|
+
'https://b.pool.opentimestamps.org',
|
|
16
|
+
'https://a.pool.eternitywall.com',
|
|
17
|
+
];
|
|
18
|
+
export class OpenTimestampsProvider {
|
|
19
|
+
id = 'opentimestamps';
|
|
20
|
+
name = 'OpenTimestamps (Bitcoin)';
|
|
21
|
+
proofLevel = 'publicly-timestamped';
|
|
22
|
+
config;
|
|
23
|
+
baseConfig;
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = {
|
|
26
|
+
calendarUrls: config.calendarUrls ?? DEFAULT_CALENDAR_URLS,
|
|
27
|
+
timeoutMs: config.timeoutMs ?? 30_000,
|
|
28
|
+
retries: config.retries ?? 3,
|
|
29
|
+
retryDelayMs: config.retryDelayMs ?? 1_000,
|
|
30
|
+
};
|
|
31
|
+
this.baseConfig = resolveBaseConfig(config);
|
|
32
|
+
}
|
|
33
|
+
async publish(anchor) {
|
|
34
|
+
// TODO: Implement using opentimestamps npm package
|
|
35
|
+
//
|
|
36
|
+
// Implementation outline:
|
|
37
|
+
// 1. Compute SHA-256 of canonical anchor: hashCanonicalAnchor(anchor)
|
|
38
|
+
// 2. Create a DetachedTimestampFile from the hash
|
|
39
|
+
// 3. Submit to calendar servers: OpenTimestamps.stamp(detached, { calendars })
|
|
40
|
+
// 4. Serialize the OTS proof to base64
|
|
41
|
+
// 5. Return { success: true, externalRef: `ots:${base64Proof}`,
|
|
42
|
+
// metadata: { calendarUrls, pendingAttestation: true } }
|
|
43
|
+
//
|
|
44
|
+
// Note: OTS proofs are initially "pending" — they confirm after a Bitcoin block
|
|
45
|
+
// includes the calendar commitment (typically 1-2 hours). A separate verification
|
|
46
|
+
// step can upgrade pending proofs to confirmed.
|
|
47
|
+
try {
|
|
48
|
+
const _hash = await hashCanonicalAnchor(anchor);
|
|
49
|
+
throw new Error('OpenTimestampsProvider is not yet implemented. ' +
|
|
50
|
+
'Install opentimestamps and implement the Bitcoin timestamping integration.');
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return {
|
|
54
|
+
providerId: this.id,
|
|
55
|
+
success: false,
|
|
56
|
+
error: e instanceof Error ? e.message : String(e),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async verify(anchor) {
|
|
61
|
+
// TODO: Deserialize OTS proof from externalRef, call OpenTimestamps.verify()
|
|
62
|
+
// Returns true if the proof is confirmed by a Bitcoin block
|
|
63
|
+
if (!anchor.externalRef)
|
|
64
|
+
return false;
|
|
65
|
+
console.warn('[OpenTimestampsProvider] verify() is not yet implemented');
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
async dispose() {
|
|
69
|
+
// No persistent resources in current implementation
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=OpenTimestampsProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenTimestampsProvider.js","sourceRoot":"","sources":["../../src/providers/OpenTimestampsProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAOhE,MAAM,qBAAqB,GAAG;IAC5B,mCAAmC;IACnC,mCAAmC;IACnC,iCAAiC;CAClC,CAAC;AAEF,MAAM,OAAO,sBAAsB;IACxB,EAAE,GAAG,gBAAgB,CAAC;IACtB,IAAI,GAAG,0BAA0B,CAAC;IAClC,UAAU,GAAe,sBAAsB,CAAC;IAExC,MAAM,CAAyC;IAC/C,UAAU,CAA+B;IAE1D,YAAY,SAAuC,EAAE;QACnD,IAAI,CAAC,MAAM,GAAG;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,qBAAqB;YAC1D,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;YAC5B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;SAC3C,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,mDAAmD;QACnD,EAAE;QACF,0BAA0B;QAC1B,wEAAwE;QACxE,oDAAoD;QACpD,iFAAiF;QACjF,yCAAyC;QACzC,kEAAkE;QAClE,sEAAsE;QACtE,EAAE;QACF,gFAAgF;QAChF,kFAAkF;QAClF,gDAAgD;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,iDAAiD;gBACjD,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,6EAA6E;QAC7E,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,oDAAoD;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file RekorProvider.ts
|
|
3
|
+
* @description Sigstore Rekor transparency log anchor provider.
|
|
4
|
+
* Publishes anchor Merkle roots as hashedrekord entries to Rekor.
|
|
5
|
+
*
|
|
6
|
+
* Proof level: `publicly-auditable`
|
|
7
|
+
* Required peer dependency: `sigstore`
|
|
8
|
+
*
|
|
9
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
10
|
+
*/
|
|
11
|
+
import type { AnchorProvider, AnchorRecord, AnchorProviderResult, ProofLevel } from '@framers/agentos';
|
|
12
|
+
import type { BaseProviderConfig } from '../types.js';
|
|
13
|
+
export interface RekorProviderConfig extends BaseProviderConfig {
|
|
14
|
+
/** Rekor server URL. Default: 'https://rekor.sigstore.dev'. */
|
|
15
|
+
serverUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class RekorProvider implements AnchorProvider {
|
|
18
|
+
readonly id = "rekor";
|
|
19
|
+
readonly name = "Sigstore Rekor Transparency Log";
|
|
20
|
+
readonly proofLevel: ProofLevel;
|
|
21
|
+
private readonly config;
|
|
22
|
+
private readonly baseConfig;
|
|
23
|
+
constructor(config?: RekorProviderConfig);
|
|
24
|
+
publish(anchor: AnchorRecord): Promise<AnchorProviderResult>;
|
|
25
|
+
verify(anchor: AnchorRecord): Promise<boolean>;
|
|
26
|
+
dispose(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=RekorProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RekorProvider.d.ts","sourceRoot":"","sources":["../../src/providers/RekorProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,qCAAqC;IAClD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAwB;IAEvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;gBAE9C,MAAM,GAAE,mBAAwB;IAUtC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4B5D,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file RekorProvider.ts
|
|
3
|
+
* @description Sigstore Rekor transparency log anchor provider.
|
|
4
|
+
* Publishes anchor Merkle roots as hashedrekord entries to Rekor.
|
|
5
|
+
*
|
|
6
|
+
* Proof level: `publicly-auditable`
|
|
7
|
+
* Required peer dependency: `sigstore`
|
|
8
|
+
*
|
|
9
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
10
|
+
*/
|
|
11
|
+
import { resolveBaseConfig } from '../types.js';
|
|
12
|
+
import { hashCanonicalAnchor } from '../utils/serialization.js';
|
|
13
|
+
const DEFAULT_SERVER_URL = 'https://rekor.sigstore.dev';
|
|
14
|
+
export class RekorProvider {
|
|
15
|
+
id = 'rekor';
|
|
16
|
+
name = 'Sigstore Rekor Transparency Log';
|
|
17
|
+
proofLevel = 'publicly-auditable';
|
|
18
|
+
config;
|
|
19
|
+
baseConfig;
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.config = {
|
|
22
|
+
serverUrl: config.serverUrl ?? DEFAULT_SERVER_URL,
|
|
23
|
+
timeoutMs: config.timeoutMs ?? 30_000,
|
|
24
|
+
retries: config.retries ?? 3,
|
|
25
|
+
retryDelayMs: config.retryDelayMs ?? 1_000,
|
|
26
|
+
};
|
|
27
|
+
this.baseConfig = resolveBaseConfig(config);
|
|
28
|
+
}
|
|
29
|
+
async publish(anchor) {
|
|
30
|
+
// TODO: Implement using sigstore SDK or direct HTTP to Rekor API
|
|
31
|
+
//
|
|
32
|
+
// Implementation outline:
|
|
33
|
+
// 1. Compute SHA-256 hash of canonical anchor: hashCanonicalAnchor(anchor)
|
|
34
|
+
// 2. Create a hashedrekord entry:
|
|
35
|
+
// POST ${serverUrl}/api/v1/log/entries
|
|
36
|
+
// Body: { kind: 'hashedrekord', apiVersion: '0.0.1',
|
|
37
|
+
// spec: { data: { hash: { algorithm: 'sha256', value: anchorHash } },
|
|
38
|
+
// signature: { content: anchor.signature, publicKey: { content: ... } } } }
|
|
39
|
+
// 3. Parse response for log index and entry UUID
|
|
40
|
+
// 4. Return { success: true, externalRef: `rekor:${logIndex}:${entryUUID}`,
|
|
41
|
+
// metadata: { logIndex, serverUrl, inclusionProof } }
|
|
42
|
+
try {
|
|
43
|
+
const _hash = await hashCanonicalAnchor(anchor);
|
|
44
|
+
throw new Error('RekorProvider is not yet implemented. ' +
|
|
45
|
+
'Install sigstore SDK and implement the Rekor transparency log integration.');
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
return {
|
|
49
|
+
providerId: this.id,
|
|
50
|
+
success: false,
|
|
51
|
+
error: e instanceof Error ? e.message : String(e),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async verify(anchor) {
|
|
56
|
+
// TODO: Retrieve entry from Rekor by externalRef and verify inclusion proof
|
|
57
|
+
// GET ${serverUrl}/api/v1/log/entries/${entryUUID}
|
|
58
|
+
// Verify inclusion proof against the transparency log root
|
|
59
|
+
if (!anchor.externalRef)
|
|
60
|
+
return false;
|
|
61
|
+
console.warn('[RekorProvider] verify() is not yet implemented');
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
async dispose() {
|
|
65
|
+
// No persistent resources in current implementation
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=RekorProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RekorProvider.js","sourceRoot":"","sources":["../../src/providers/RekorProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAOhE,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAExD,MAAM,OAAO,aAAa;IACf,EAAE,GAAG,OAAO,CAAC;IACb,IAAI,GAAG,iCAAiC,CAAC;IACzC,UAAU,GAAe,oBAAoB,CAAC;IAEtC,MAAM,CAAgC;IACtC,UAAU,CAA+B;IAE1D,YAAY,SAA8B,EAAE;QAC1C,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,kBAAkB;YACjD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;YAC5B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;SAC3C,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,iEAAiE;QACjE,EAAE;QACF,0BAA0B;QAC1B,6EAA6E;QAC7E,oCAAoC;QACpC,4CAA4C;QAC5C,0DAA0D;QAC1D,mFAAmF;QACnF,iGAAiG;QACjG,mDAAmD;QACnD,8EAA8E;QAC9E,mEAAmE;QACnE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,wCAAwC;gBACxC,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,4EAA4E;QAC5E,qDAAqD;QACrD,6DAA6D;QAC7D,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,oDAAoD;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file SolanaProvider.ts
|
|
3
|
+
* @description Solana on-chain anchor provider (Wunderland-compatible).
|
|
4
|
+
*
|
|
5
|
+
* Publishes AgentOS anchor records via the `anchor_post` instruction of the
|
|
6
|
+
* Wunderland Solana program (content_hash + manifest_hash).
|
|
7
|
+
*
|
|
8
|
+
* Proof level: `publicly-timestamped`
|
|
9
|
+
*
|
|
10
|
+
* Required runtime dependency: `@solana/web3.js`
|
|
11
|
+
* Optional runtime dependency (only if using base58 secret keys): `bs58`
|
|
12
|
+
*
|
|
13
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
14
|
+
*/
|
|
15
|
+
import type { AnchorProvider, AnchorRecord, AnchorProviderResult, ProofLevel } from '@framers/agentos';
|
|
16
|
+
import type { BaseProviderConfig } from '../types.js';
|
|
17
|
+
export interface SolanaProviderConfig extends BaseProviderConfig {
|
|
18
|
+
/** JSON-RPC endpoint URL. */
|
|
19
|
+
rpcUrl: string;
|
|
20
|
+
/** Wunderland on-chain program ID. */
|
|
21
|
+
programId: string;
|
|
22
|
+
/**
|
|
23
|
+
* Signer secret key (Solana Keypair secretKey bytes) as a JSON number array.
|
|
24
|
+
* Example: the contents of a Solana CLI keypair file.
|
|
25
|
+
*/
|
|
26
|
+
signerSecretKeyJson?: number[];
|
|
27
|
+
/** Path to Solana keypair JSON file (array of numbers). */
|
|
28
|
+
signerKeypairPath?: string;
|
|
29
|
+
/** Base58-encoded signer secret key bytes (64 bytes). */
|
|
30
|
+
signerPrivateKeyBase58?: string;
|
|
31
|
+
/** Solana cluster label used only for `externalRef` formatting. */
|
|
32
|
+
cluster?: 'devnet' | 'testnet' | 'mainnet-beta' | 'localnet';
|
|
33
|
+
/** Commitment level (e.g. 'confirmed', 'finalized'). Default: 'confirmed'. */
|
|
34
|
+
commitment?: string;
|
|
35
|
+
/**
|
|
36
|
+
* If true, automatically initializes the agent (initialize_agent) when missing.
|
|
37
|
+
* Default: true
|
|
38
|
+
*/
|
|
39
|
+
autoInitializeAgent?: boolean;
|
|
40
|
+
/** Display name used when auto-initializing the agent. Default: 'AgentOS'. */
|
|
41
|
+
agentDisplayName?: string;
|
|
42
|
+
/**
|
|
43
|
+
* HEXACO traits (u16 0-1000) used when auto-initializing the agent.
|
|
44
|
+
* Order: [H, E, X, A, C, O]
|
|
45
|
+
*/
|
|
46
|
+
agentHexacoTraits?: [number, number, number, number, number, number];
|
|
47
|
+
}
|
|
48
|
+
export declare class SolanaProvider implements AnchorProvider {
|
|
49
|
+
readonly id = "solana";
|
|
50
|
+
readonly name = "Solana On-Chain Anchor (Wunderland)";
|
|
51
|
+
readonly proofLevel: ProofLevel;
|
|
52
|
+
private readonly config;
|
|
53
|
+
private readonly baseConfig;
|
|
54
|
+
constructor(config: SolanaProviderConfig);
|
|
55
|
+
publish(anchor: AnchorRecord): Promise<AnchorProviderResult>;
|
|
56
|
+
verify(anchor: AnchorRecord): Promise<boolean>;
|
|
57
|
+
dispose(): Promise<void>;
|
|
58
|
+
private loadWeb3;
|
|
59
|
+
private loadSigner;
|
|
60
|
+
private loadBs58;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=SolanaProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolanaProvider.d.ts","sourceRoot":"","sources":["../../src/providers/SolanaProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGvG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,mEAAmE;IACnE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;IAE7D,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtE;AA4CD,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,IAAI,yCAAyC;IACtD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAA0B;IAEzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;gBAE9C,MAAM,EAAE,oBAAoB;IAWlC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA6I5D,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIhB,QAAQ;YAYR,UAAU;YAwBV,QAAQ;CASvB"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file SolanaProvider.ts
|
|
3
|
+
* @description Solana on-chain anchor provider (Wunderland-compatible).
|
|
4
|
+
*
|
|
5
|
+
* Publishes AgentOS anchor records via the `anchor_post` instruction of the
|
|
6
|
+
* Wunderland Solana program (content_hash + manifest_hash).
|
|
7
|
+
*
|
|
8
|
+
* Proof level: `publicly-timestamped`
|
|
9
|
+
*
|
|
10
|
+
* Required runtime dependency: `@solana/web3.js`
|
|
11
|
+
* Optional runtime dependency (only if using base58 secret keys): `bs58`
|
|
12
|
+
*
|
|
13
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
import { existsSync, readFileSync } from 'fs';
|
|
17
|
+
import { resolveBaseConfig } from '../types.js';
|
|
18
|
+
import { hashCanonicalAnchor } from '../utils/serialization.js';
|
|
19
|
+
const DEFAULT_HEXACO = [800, 450, 650, 750, 850, 700];
|
|
20
|
+
function instructionDiscriminator(methodName) {
|
|
21
|
+
return createHash('sha256')
|
|
22
|
+
.update(`global:${methodName}`)
|
|
23
|
+
.digest()
|
|
24
|
+
.subarray(0, 8);
|
|
25
|
+
}
|
|
26
|
+
function encodeName32(displayName) {
|
|
27
|
+
const bytes = Buffer.alloc(32, 0);
|
|
28
|
+
Buffer.from(displayName, 'utf-8').copy(bytes, 0, 0, Math.min(displayName.length, 32));
|
|
29
|
+
return bytes;
|
|
30
|
+
}
|
|
31
|
+
function parseSolExternalRef(externalRef) {
|
|
32
|
+
// Format: sol:<cluster>:<postPda>:<txSignature>
|
|
33
|
+
const parts = externalRef.split(':');
|
|
34
|
+
if (parts.length < 4)
|
|
35
|
+
return null;
|
|
36
|
+
const [prefix, cluster, postPda, txSignature] = parts;
|
|
37
|
+
if (prefix !== 'sol' && prefix !== 'solana')
|
|
38
|
+
return null;
|
|
39
|
+
return { cluster, postPda, txSignature };
|
|
40
|
+
}
|
|
41
|
+
function sha256Hex(input) {
|
|
42
|
+
return createHash('sha256').update(input, 'utf8').digest('hex');
|
|
43
|
+
}
|
|
44
|
+
function canonicalizeSolanaManifest(anchor) {
|
|
45
|
+
// Deterministic (sorted keys) is achieved by constructing object literal in stable order.
|
|
46
|
+
return JSON.stringify({
|
|
47
|
+
anchorId: anchor.id,
|
|
48
|
+
eventCount: anchor.eventCount,
|
|
49
|
+
merkleRoot: anchor.merkleRoot,
|
|
50
|
+
schema: 'agentos.solana-anchor-manifest.v1',
|
|
51
|
+
sequenceFrom: anchor.sequenceFrom,
|
|
52
|
+
sequenceTo: anchor.sequenceTo,
|
|
53
|
+
signature: anchor.signature,
|
|
54
|
+
timestamp: anchor.timestamp,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export class SolanaProvider {
|
|
58
|
+
id = 'solana';
|
|
59
|
+
name = 'Solana On-Chain Anchor (Wunderland)';
|
|
60
|
+
proofLevel = 'publicly-timestamped';
|
|
61
|
+
config;
|
|
62
|
+
baseConfig;
|
|
63
|
+
constructor(config) {
|
|
64
|
+
this.config = {
|
|
65
|
+
cluster: 'devnet',
|
|
66
|
+
commitment: 'confirmed',
|
|
67
|
+
autoInitializeAgent: true,
|
|
68
|
+
agentDisplayName: 'AgentOS',
|
|
69
|
+
...config,
|
|
70
|
+
};
|
|
71
|
+
this.baseConfig = resolveBaseConfig(config);
|
|
72
|
+
}
|
|
73
|
+
async publish(anchor) {
|
|
74
|
+
const publishedAt = new Date().toISOString();
|
|
75
|
+
try {
|
|
76
|
+
if (!this.config.rpcUrl) {
|
|
77
|
+
throw new Error('Missing required config: rpcUrl');
|
|
78
|
+
}
|
|
79
|
+
if (!this.config.programId) {
|
|
80
|
+
throw new Error('Missing required config: programId');
|
|
81
|
+
}
|
|
82
|
+
const hasSigner = (this.config.signerSecretKeyJson && this.config.signerSecretKeyJson.length > 0) ||
|
|
83
|
+
!!this.config.signerKeypairPath ||
|
|
84
|
+
!!this.config.signerPrivateKeyBase58;
|
|
85
|
+
if (!hasSigner) {
|
|
86
|
+
throw new Error('Missing signer configuration. Provide one of: signerSecretKeyJson, signerKeypairPath, signerPrivateKeyBase58.');
|
|
87
|
+
}
|
|
88
|
+
if (this.config.signerKeypairPath && !existsSync(this.config.signerKeypairPath)) {
|
|
89
|
+
throw new Error(`signerKeypairPath does not exist: ${this.config.signerKeypairPath}`);
|
|
90
|
+
}
|
|
91
|
+
const web3 = await this.loadWeb3();
|
|
92
|
+
const signer = await this.loadSigner(web3);
|
|
93
|
+
const connection = new web3.Connection(this.config.rpcUrl, this.config.commitment);
|
|
94
|
+
const programId = new web3.PublicKey(this.config.programId);
|
|
95
|
+
// ── Derive agent PDA ────────────────────────────────────────────────
|
|
96
|
+
const [agentPda] = web3.PublicKey.findProgramAddressSync([Buffer.from('agent'), signer.publicKey.toBuffer()], programId);
|
|
97
|
+
// ── Ensure agent exists (optional auto-init) ────────────────────────
|
|
98
|
+
let agentInfo = await connection.getAccountInfo(agentPda, this.config.commitment);
|
|
99
|
+
if (!agentInfo && this.config.autoInitializeAgent) {
|
|
100
|
+
const displayName = this.config.agentDisplayName || 'AgentOS';
|
|
101
|
+
const traits = this.config.agentHexacoTraits || DEFAULT_HEXACO;
|
|
102
|
+
const initData = Buffer.alloc(8 + 32 + 12);
|
|
103
|
+
instructionDiscriminator('initialize_agent').copy(initData, 0);
|
|
104
|
+
encodeName32(displayName).copy(initData, 8);
|
|
105
|
+
for (let i = 0; i < 6; i++) {
|
|
106
|
+
const val = traits[i];
|
|
107
|
+
if (val < 0 || val > 1000) {
|
|
108
|
+
throw new Error(`Invalid agentHexacoTraits[${i}] value: ${val} (expected 0..1000)`);
|
|
109
|
+
}
|
|
110
|
+
initData.writeUInt16LE(val, 8 + 32 + i * 2);
|
|
111
|
+
}
|
|
112
|
+
const ix = new web3.TransactionInstruction({
|
|
113
|
+
programId,
|
|
114
|
+
keys: [
|
|
115
|
+
{ pubkey: agentPda, isSigner: false, isWritable: true },
|
|
116
|
+
{ pubkey: signer.publicKey, isSigner: true, isWritable: true },
|
|
117
|
+
{ pubkey: web3.SystemProgram.programId, isSigner: false, isWritable: false },
|
|
118
|
+
],
|
|
119
|
+
data: initData,
|
|
120
|
+
});
|
|
121
|
+
const tx = new web3.Transaction().add(ix);
|
|
122
|
+
await web3.sendAndConfirmTransaction(connection, tx, [signer]);
|
|
123
|
+
agentInfo = await connection.getAccountInfo(agentPda, this.config.commitment);
|
|
124
|
+
}
|
|
125
|
+
if (!agentInfo) {
|
|
126
|
+
throw new Error('AgentIdentity not found. Provide a registered signer or enable autoInitializeAgent.');
|
|
127
|
+
}
|
|
128
|
+
// total_posts is at offset 8 + 32 + 32 + 12 + 1 + 8 = 93
|
|
129
|
+
const agentData = Buffer.from(agentInfo.data);
|
|
130
|
+
if (agentData.length < 97) {
|
|
131
|
+
throw new Error(`AgentIdentity account data too small (${agentData.length} bytes).`);
|
|
132
|
+
}
|
|
133
|
+
const postIndex = agentData.readUInt32LE(93);
|
|
134
|
+
const indexBuf = Buffer.alloc(4);
|
|
135
|
+
indexBuf.writeUInt32LE(postIndex);
|
|
136
|
+
const [postPda] = web3.PublicKey.findProgramAddressSync([Buffer.from('post'), agentPda.toBuffer(), indexBuf], programId);
|
|
137
|
+
// ── Hashes ──────────────────────────────────────────────────────────
|
|
138
|
+
const contentHashHex = await hashCanonicalAnchor(anchor);
|
|
139
|
+
const manifestHashHex = sha256Hex(canonicalizeSolanaManifest(anchor));
|
|
140
|
+
const contentHash = Buffer.from(contentHashHex, 'hex');
|
|
141
|
+
const manifestHash = Buffer.from(manifestHashHex, 'hex');
|
|
142
|
+
if (contentHash.length !== 32 || manifestHash.length !== 32) {
|
|
143
|
+
throw new Error('Computed hashes are not 32 bytes.');
|
|
144
|
+
}
|
|
145
|
+
const data = Buffer.concat([
|
|
146
|
+
instructionDiscriminator('anchor_post'),
|
|
147
|
+
contentHash,
|
|
148
|
+
manifestHash,
|
|
149
|
+
]);
|
|
150
|
+
const postIx = new web3.TransactionInstruction({
|
|
151
|
+
programId,
|
|
152
|
+
keys: [
|
|
153
|
+
{ pubkey: postPda, isSigner: false, isWritable: true },
|
|
154
|
+
{ pubkey: agentPda, isSigner: false, isWritable: true },
|
|
155
|
+
{ pubkey: signer.publicKey, isSigner: true, isWritable: true },
|
|
156
|
+
{ pubkey: web3.SystemProgram.programId, isSigner: false, isWritable: false },
|
|
157
|
+
],
|
|
158
|
+
data,
|
|
159
|
+
});
|
|
160
|
+
const postTx = new web3.Transaction().add(postIx);
|
|
161
|
+
const txSignature = await web3.sendAndConfirmTransaction(connection, postTx, [signer]);
|
|
162
|
+
return {
|
|
163
|
+
providerId: this.id,
|
|
164
|
+
success: true,
|
|
165
|
+
publishedAt,
|
|
166
|
+
externalRef: `sol:${this.config.cluster}:${postPda.toBase58()}:${txSignature}`,
|
|
167
|
+
metadata: {
|
|
168
|
+
cluster: this.config.cluster,
|
|
169
|
+
commitment: this.config.commitment,
|
|
170
|
+
postPda: postPda.toBase58(),
|
|
171
|
+
agentPda: agentPda.toBase58(),
|
|
172
|
+
postIndex,
|
|
173
|
+
txSignature,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
return {
|
|
179
|
+
providerId: this.id,
|
|
180
|
+
success: false,
|
|
181
|
+
publishedAt,
|
|
182
|
+
error: e instanceof Error ? e.message : String(e),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async verify(anchor) {
|
|
187
|
+
try {
|
|
188
|
+
if (!anchor.externalRef)
|
|
189
|
+
return false;
|
|
190
|
+
const parsed = parseSolExternalRef(anchor.externalRef);
|
|
191
|
+
if (!parsed?.postPda)
|
|
192
|
+
return false;
|
|
193
|
+
const web3 = await this.loadWeb3();
|
|
194
|
+
const connection = new web3.Connection(this.config.rpcUrl, this.config.commitment);
|
|
195
|
+
const postKey = new web3.PublicKey(parsed.postPda);
|
|
196
|
+
const postInfo = await connection.getAccountInfo(postKey, this.config.commitment);
|
|
197
|
+
if (!postInfo)
|
|
198
|
+
return false;
|
|
199
|
+
const data = Buffer.from(postInfo.data);
|
|
200
|
+
// discriminator (8) + agent (32) + post_index (4)
|
|
201
|
+
const offset = 8 + 32 + 4;
|
|
202
|
+
if (data.length < offset + 64)
|
|
203
|
+
return false;
|
|
204
|
+
const onChainContentHash = data.subarray(offset, offset + 32);
|
|
205
|
+
const onChainManifestHash = data.subarray(offset + 32, offset + 64);
|
|
206
|
+
const expectedContentHash = Buffer.from(await hashCanonicalAnchor(anchor), 'hex');
|
|
207
|
+
const expectedManifestHash = Buffer.from(sha256Hex(canonicalizeSolanaManifest(anchor)), 'hex');
|
|
208
|
+
return onChainContentHash.equals(expectedContentHash) && onChainManifestHash.equals(expectedManifestHash);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async dispose() {
|
|
215
|
+
// No persistent resources.
|
|
216
|
+
}
|
|
217
|
+
async loadWeb3() {
|
|
218
|
+
const moduleName = '@solana/web3.js';
|
|
219
|
+
try {
|
|
220
|
+
return await import(moduleName);
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
throw new Error('SolanaProvider requires @solana/web3.js at runtime. ' +
|
|
224
|
+
'Install it in your project to enable Solana anchoring.');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async loadSigner(web3) {
|
|
228
|
+
if (this.config.signerSecretKeyJson && this.config.signerSecretKeyJson.length > 0) {
|
|
229
|
+
return web3.Keypair.fromSecretKey(Uint8Array.from(this.config.signerSecretKeyJson));
|
|
230
|
+
}
|
|
231
|
+
if (this.config.signerKeypairPath) {
|
|
232
|
+
if (!existsSync(this.config.signerKeypairPath)) {
|
|
233
|
+
throw new Error(`signerKeypairPath does not exist: ${this.config.signerKeypairPath}`);
|
|
234
|
+
}
|
|
235
|
+
const raw = JSON.parse(readFileSync(this.config.signerKeypairPath, 'utf-8'));
|
|
236
|
+
return web3.Keypair.fromSecretKey(Uint8Array.from(raw));
|
|
237
|
+
}
|
|
238
|
+
if (this.config.signerPrivateKeyBase58) {
|
|
239
|
+
const bs58 = await this.loadBs58();
|
|
240
|
+
const secretKey = bs58.decode(this.config.signerPrivateKeyBase58);
|
|
241
|
+
return web3.Keypair.fromSecretKey(secretKey);
|
|
242
|
+
}
|
|
243
|
+
throw new Error('Missing signer configuration. Provide one of: signerSecretKeyJson, signerKeypairPath, signerPrivateKeyBase58.');
|
|
244
|
+
}
|
|
245
|
+
async loadBs58() {
|
|
246
|
+
const moduleName = 'bs58';
|
|
247
|
+
try {
|
|
248
|
+
const mod = await import(moduleName);
|
|
249
|
+
return mod.default ?? mod;
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
throw new Error('signerPrivateKeyBase58 requires the optional dependency "bs58" at runtime.');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=SolanaProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolanaProvider.js","sourceRoot":"","sources":["../../src/providers/SolanaProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file WormSnapshotProvider.ts
|
|
3
|
+
* @description S3 Object Lock / WORM storage anchor provider.
|
|
4
|
+
* Publishes anchor records to an S3 bucket with Object Lock governance/compliance retention.
|
|
5
|
+
*
|
|
6
|
+
* Proof level: `externally-archived`
|
|
7
|
+
* Required peer dependency: `@aws-sdk/client-s3`
|
|
8
|
+
*
|
|
9
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
10
|
+
*/
|
|
11
|
+
import type { AnchorProvider, AnchorRecord, AnchorProviderResult, ProofLevel } from '@framers/agentos';
|
|
12
|
+
import type { BaseProviderConfig } from '../types.js';
|
|
13
|
+
export interface WormSnapshotProviderConfig extends BaseProviderConfig {
|
|
14
|
+
/** S3 bucket name (must have Object Lock enabled). */
|
|
15
|
+
bucket: string;
|
|
16
|
+
/** S3 region. */
|
|
17
|
+
region: string;
|
|
18
|
+
/** Key prefix for anchor objects. Default: 'provenance/anchors/'. */
|
|
19
|
+
keyPrefix?: string;
|
|
20
|
+
/** Retention period in days. Default: 365. */
|
|
21
|
+
retentionDays?: number;
|
|
22
|
+
/** Retention mode: 'GOVERNANCE' or 'COMPLIANCE'. Default: 'GOVERNANCE'. */
|
|
23
|
+
retentionMode?: 'GOVERNANCE' | 'COMPLIANCE';
|
|
24
|
+
}
|
|
25
|
+
export declare class WormSnapshotProvider implements AnchorProvider {
|
|
26
|
+
readonly id = "worm-snapshot";
|
|
27
|
+
readonly name = "WORM Snapshot (S3 Object Lock)";
|
|
28
|
+
readonly proofLevel: ProofLevel;
|
|
29
|
+
private readonly config;
|
|
30
|
+
private readonly baseConfig;
|
|
31
|
+
constructor(config: WormSnapshotProviderConfig);
|
|
32
|
+
publish(anchor: AnchorRecord): Promise<AnchorProviderResult>;
|
|
33
|
+
verify(anchor: AnchorRecord): Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=WormSnapshotProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WormSnapshotProvider.d.ts","sourceRoot":"","sources":["../../src/providers/WormSnapshotProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;CAC7C;AAED,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,EAAE,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,oCAAoC;IACjD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAyB;IAExD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;gBAE9C,MAAM,EAAE,0BAA0B;IAUxC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA8B5D,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CAMrD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file WormSnapshotProvider.ts
|
|
3
|
+
* @description S3 Object Lock / WORM storage anchor provider.
|
|
4
|
+
* Publishes anchor records to an S3 bucket with Object Lock governance/compliance retention.
|
|
5
|
+
*
|
|
6
|
+
* Proof level: `externally-archived`
|
|
7
|
+
* Required peer dependency: `@aws-sdk/client-s3`
|
|
8
|
+
*
|
|
9
|
+
* @module @framers/agentos-ext-anchor-providers
|
|
10
|
+
*/
|
|
11
|
+
import { resolveBaseConfig } from '../types.js';
|
|
12
|
+
import { canonicalizeAnchor } from '../utils/serialization.js';
|
|
13
|
+
export class WormSnapshotProvider {
|
|
14
|
+
id = 'worm-snapshot';
|
|
15
|
+
name = 'WORM Snapshot (S3 Object Lock)';
|
|
16
|
+
proofLevel = 'externally-archived';
|
|
17
|
+
config;
|
|
18
|
+
baseConfig;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = {
|
|
21
|
+
keyPrefix: 'provenance/anchors/',
|
|
22
|
+
retentionDays: 365,
|
|
23
|
+
retentionMode: 'GOVERNANCE',
|
|
24
|
+
...config,
|
|
25
|
+
};
|
|
26
|
+
this.baseConfig = resolveBaseConfig(config);
|
|
27
|
+
}
|
|
28
|
+
async publish(anchor) {
|
|
29
|
+
// TODO: Implement using @aws-sdk/client-s3
|
|
30
|
+
//
|
|
31
|
+
// Implementation outline:
|
|
32
|
+
// 1. Import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
|
|
33
|
+
// 2. Create S3Client with region from config
|
|
34
|
+
// 3. Serialize anchor via canonicalizeAnchor()
|
|
35
|
+
// 4. PutObject with:
|
|
36
|
+
// - Bucket: this.config.bucket
|
|
37
|
+
// - Key: `${this.config.keyPrefix}${anchor.id}.json`
|
|
38
|
+
// - Body: canonical JSON
|
|
39
|
+
// - ContentType: 'application/json'
|
|
40
|
+
// - ObjectLockMode: this.config.retentionMode
|
|
41
|
+
// - ObjectLockRetainUntilDate: now + retentionDays
|
|
42
|
+
// 5. Return { success: true, externalRef: `s3://${bucket}/${key}` }
|
|
43
|
+
try {
|
|
44
|
+
const _canonical = canonicalizeAnchor(anchor);
|
|
45
|
+
throw new Error('WormSnapshotProvider is not yet implemented. ' +
|
|
46
|
+
'Install @aws-sdk/client-s3 and implement the S3 Object Lock integration.');
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return {
|
|
50
|
+
providerId: this.id,
|
|
51
|
+
success: false,
|
|
52
|
+
error: e instanceof Error ? e.message : String(e),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async verify(anchor) {
|
|
57
|
+
// TODO: Implement using HeadObject to check object exists and retention is active
|
|
58
|
+
if (!anchor.externalRef)
|
|
59
|
+
return false;
|
|
60
|
+
console.warn('[WormSnapshotProvider] verify() is not yet implemented');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=WormSnapshotProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WormSnapshotProvider.js","sourceRoot":"","sources":["../../src/providers/WormSnapshotProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAe/D,MAAM,OAAO,oBAAoB;IACtB,EAAE,GAAG,eAAe,CAAC;IACrB,IAAI,GAAG,gCAAgC,CAAC;IACxC,UAAU,GAAe,qBAAqB,CAAC;IAEvC,MAAM,CAA6B;IACnC,UAAU,CAA+B;IAE1D,YAAY,MAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,qBAAqB;YAChC,aAAa,EAAE,GAAG;YAClB,aAAa,EAAE,YAAY;YAC3B,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,2CAA2C;QAC3C,EAAE;QACF,0BAA0B;QAC1B,uEAAuE;QACvE,+CAA+C;QAC/C,iDAAiD;QACjD,uBAAuB;QACvB,oCAAoC;QACpC,0DAA0D;QAC1D,8BAA8B;QAC9B,yCAAyC;QACzC,mDAAmD;QACnD,wDAAwD;QACxD,sEAAsE;QACtE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,+CAA+C;gBAC/C,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,EAAE;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,kFAAkF;QAClF,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|