@longarc/mdash 3.1.1 → 3.1.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.
- package/README.md +86 -23
- package/SECURITY.md +254 -0
- package/dist/accountability/engine.d.ts +27 -0
- package/dist/accountability/engine.d.ts.map +1 -0
- package/dist/accountability/engine.js +148 -0
- package/dist/accountability/engine.js.map +1 -0
- package/dist/accountability/types.d.ts +46 -0
- package/dist/accountability/types.d.ts.map +1 -0
- package/dist/accountability/types.js +8 -0
- package/dist/accountability/types.js.map +1 -0
- package/dist/checkpoint/engine.d.ts +2 -2
- package/dist/checkpoint/engine.d.ts.map +1 -1
- package/dist/checkpoint/engine.js +5 -1
- package/dist/checkpoint/engine.js.map +1 -1
- package/dist/context/compose.d.ts +62 -0
- package/dist/context/compose.d.ts.map +1 -0
- package/dist/context/compose.js +286 -0
- package/dist/context/compose.js.map +1 -0
- package/dist/context/crypto/hash.d.ts +100 -0
- package/dist/context/crypto/hash.d.ts.map +1 -0
- package/dist/context/crypto/hash.js +248 -0
- package/dist/context/crypto/hash.js.map +1 -0
- package/dist/context/crypto/hmac.d.ts +80 -0
- package/dist/context/crypto/hmac.d.ts.map +1 -0
- package/dist/context/crypto/hmac.js +192 -0
- package/dist/context/crypto/hmac.js.map +1 -0
- package/dist/context/crypto/index.d.ts +7 -0
- package/dist/context/crypto/index.d.ts.map +1 -0
- package/dist/context/crypto/index.js +7 -0
- package/dist/context/crypto/index.js.map +1 -0
- package/dist/context/engine-v3.0-backup.d.ts +197 -0
- package/dist/context/engine-v3.0-backup.d.ts.map +1 -0
- package/dist/context/engine-v3.0-backup.js +392 -0
- package/dist/context/engine-v3.0-backup.js.map +1 -0
- package/dist/context/engine.d.ts +2 -2
- package/dist/context/engine.d.ts.map +1 -1
- package/dist/context/engine.js +2 -2
- package/dist/context/engine.js.map +1 -1
- package/dist/context/fragment.d.ts +99 -0
- package/dist/context/fragment.d.ts.map +1 -0
- package/dist/context/fragment.js +316 -0
- package/dist/context/fragment.js.map +1 -0
- package/dist/context/index.d.ts +99 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +180 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/provenance.d.ts +80 -0
- package/dist/context/provenance.d.ts.map +1 -0
- package/dist/context/provenance.js +294 -0
- package/dist/context/provenance.js.map +1 -0
- package/dist/context/resolve.d.ts +106 -0
- package/dist/context/resolve.d.ts.map +1 -0
- package/dist/context/resolve.js +440 -0
- package/dist/context/resolve.js.map +1 -0
- package/dist/context/store.d.ts +156 -0
- package/dist/context/store.d.ts.map +1 -0
- package/dist/context/store.js +396 -0
- package/dist/context/store.js.map +1 -0
- package/dist/context/types.d.ts +463 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +94 -0
- package/dist/context/types.js.map +1 -0
- package/dist/context/utils/atomic.d.ts +76 -0
- package/dist/context/utils/atomic.d.ts.map +1 -0
- package/dist/context/utils/atomic.js +159 -0
- package/dist/context/utils/atomic.js.map +1 -0
- package/dist/context/utils/credit.d.ts +65 -0
- package/dist/context/utils/credit.d.ts.map +1 -0
- package/dist/context/utils/credit.js +164 -0
- package/dist/context/utils/credit.js.map +1 -0
- package/dist/context/utils/index.d.ts +13 -0
- package/dist/context/utils/index.d.ts.map +1 -0
- package/dist/context/utils/index.js +13 -0
- package/dist/context/utils/index.js.map +1 -0
- package/dist/context/utils/utility.d.ts +63 -0
- package/dist/context/utils/utility.d.ts.map +1 -0
- package/dist/context/utils/utility.js +141 -0
- package/dist/context/utils/utility.js.map +1 -0
- package/dist/core/commitment.d.ts +26 -3
- package/dist/core/commitment.d.ts.map +1 -1
- package/dist/core/commitment.js +45 -7
- package/dist/core/commitment.js.map +1 -1
- package/dist/core/crypto.d.ts +2 -0
- package/dist/core/crypto.d.ts.map +1 -1
- package/dist/core/crypto.js +12 -0
- package/dist/core/crypto.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -10
- package/dist/index.js.map +1 -1
- package/dist/mcca/engine.d.ts.map +1 -1
- package/dist/mcca/engine.js +5 -4
- package/dist/mcca/engine.js.map +1 -1
- package/dist/physics/engine.d.ts +3 -2
- package/dist/physics/engine.d.ts.map +1 -1
- package/dist/physics/engine.js +37 -3
- package/dist/physics/engine.js.map +1 -1
- package/dist/provenance/api-handler.d.ts +45 -0
- package/dist/provenance/api-handler.d.ts.map +1 -0
- package/dist/provenance/api-handler.js +223 -0
- package/dist/provenance/api-handler.js.map +1 -0
- package/dist/provenance/api-types.d.ts +108 -0
- package/dist/provenance/api-types.d.ts.map +1 -0
- package/dist/provenance/api-types.js +9 -0
- package/dist/provenance/api-types.js.map +1 -0
- package/dist/provenance/index.d.ts +6 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +3 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/provenance-engine.d.ts +63 -0
- package/dist/provenance/provenance-engine.d.ts.map +1 -0
- package/dist/provenance/provenance-engine.js +311 -0
- package/dist/provenance/provenance-engine.js.map +1 -0
- package/dist/provenance/types.d.ts +193 -0
- package/dist/provenance/types.d.ts.map +1 -0
- package/dist/provenance/types.js +9 -0
- package/dist/provenance/types.js.map +1 -0
- package/dist/tee/engine.d.ts.map +1 -1
- package/dist/tee/engine.js +14 -0
- package/dist/tee/engine.js.map +1 -1
- package/dist/warrant/engine.d.ts +24 -1
- package/dist/warrant/engine.d.ts.map +1 -1
- package/dist/warrant/engine.js +76 -1
- package/dist/warrant/engine.js.map +1 -1
- package/dist/zk/engine.d.ts.map +1 -1
- package/dist/zk/engine.js +7 -4
- package/dist/zk/engine.js.map +1 -1
- package/docs/SECURITY-PATCHES.md +170 -0
- package/package.json +17 -5
- package/src/__tests__/accountability.test.ts +308 -0
- package/src/__tests__/l1-verification-modes.test.ts +424 -0
- package/src/__tests__/phase1.benchmark.test.ts +94 -0
- package/src/__tests__/phase1.test.ts +0 -77
- package/src/__tests__/phase2-4.benchmark.test.ts +60 -0
- package/src/__tests__/phase2-4.test.ts +1 -52
- package/src/__tests__/provenance/api-handler.test.ts +356 -0
- package/src/__tests__/provenance/provenance-engine.test.ts +628 -0
- package/src/__tests__/sa-2026-008.test.ts +45 -0
- package/src/__tests__/sa-2026-009.test.ts +86 -0
- package/src/__tests__/sa-2026-010.test.ts +72 -0
- package/src/__tests__/sa-2026-012.test.ts +65 -0
- package/src/__tests__/sa-2026-nfc.test.ts +40 -0
- package/src/__tests__/security.test.ts +786 -0
- package/src/accountability/engine.ts +230 -0
- package/src/accountability/types.ts +58 -0
- package/src/checkpoint/engine.ts +6 -2
- package/src/context/__tests__/caret-v0.2.0.test.ts +860 -0
- package/src/context/__tests__/integration.test.ts +356 -0
- package/src/context/compose.ts +388 -0
- package/src/context/crypto/hash.ts +277 -0
- package/src/context/crypto/hmac.ts +253 -0
- package/src/context/crypto/index.ts +29 -0
- package/src/context/engine-v3.0-backup.ts +598 -0
- package/src/context/engine.ts +2 -2
- package/src/context/fragment.ts +454 -0
- package/src/context/index.ts +427 -0
- package/src/context/provenance.ts +380 -0
- package/src/context/resolve.ts +581 -0
- package/src/context/store.ts +503 -0
- package/src/context/types.ts +679 -0
- package/src/context/utils/atomic.ts +207 -0
- package/src/context/utils/credit.ts +224 -0
- package/src/context/utils/index.ts +13 -0
- package/src/context/utils/utility.ts +200 -0
- package/src/core/commitment.ts +130 -68
- package/src/core/crypto.ts +13 -0
- package/src/index.ts +62 -10
- package/src/mcca/engine.ts +5 -4
- package/src/physics/engine.ts +42 -5
- package/src/provenance/api-handler.ts +248 -0
- package/src/provenance/api-types.ts +112 -0
- package/src/provenance/index.ts +19 -0
- package/src/provenance/provenance-engine.ts +387 -0
- package/src/provenance/types.ts +211 -0
- package/src/tee/engine.ts +16 -0
- package/src/warrant/engine.ts +89 -1
- package/src/zk/engine.ts +8 -4
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdash v3.1 — Context Module (formerly Caret)
|
|
3
|
+
* @module @longarcstudios/mdash/context
|
|
4
|
+
* @version 3.1.0
|
|
5
|
+
*
|
|
6
|
+
* The context primitive runtime, now integrated into mdash.
|
|
7
|
+
*
|
|
8
|
+
* Architecture: LLM at the edges, cryptography at the core.
|
|
9
|
+
*
|
|
10
|
+
* v3.1.0: Merged into mdash from Caret v0.2.0
|
|
11
|
+
* - MdashActionCode for standardized action vocabulary
|
|
12
|
+
* - InfluenceBudget for MCCA-compliant bounds
|
|
13
|
+
* - InfluenceConstraint for influence-based resolution
|
|
14
|
+
* - Outcome<T> for Intent-Experience-Utility tracking
|
|
15
|
+
* - Atomic encoding with coreference resolution
|
|
16
|
+
* - Utility learning and credit assignment utilities
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { createCaret, requireInfluence } from '@longarcstudios/caret';
|
|
21
|
+
*
|
|
22
|
+
* const caret = createCaret({ seal_key: 'your-secret-key' });
|
|
23
|
+
*
|
|
24
|
+
* // Seal content into a fragment with MCCA constraints
|
|
25
|
+
* const fragment = await caret.seal({
|
|
26
|
+
* content: { message: 'Hello, world!' },
|
|
27
|
+
* source: 'app://example/greeting',
|
|
28
|
+
* attribution: 'system',
|
|
29
|
+
* constraints: [
|
|
30
|
+
* requireInfluence({ system: 0.45, user: 0.30, environment: 0.15, assistant: 0.10 })
|
|
31
|
+
* ],
|
|
32
|
+
* atomic_encoding: { enabled: true }
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Compose multiple fragments
|
|
36
|
+
* const manifold = await caret.compose([
|
|
37
|
+
* fragment,
|
|
38
|
+
* anotherFragment
|
|
39
|
+
* ], { ceiling: '8k tokens' });
|
|
40
|
+
*
|
|
41
|
+
* // Resolve through constraints
|
|
42
|
+
* const result = await caret.resolve(fragment);
|
|
43
|
+
* if (result.success) {
|
|
44
|
+
* console.log('Fragment is valid:', result.fragment);
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
import { createFragment, verifyFragment, setTokenizer, } from './fragment.js';
|
|
49
|
+
import { compose } from './compose.js';
|
|
50
|
+
import { resolve } from './resolve.js';
|
|
51
|
+
import { MemoryStore } from './store.js';
|
|
52
|
+
/**
|
|
53
|
+
* Create the Caret runtime.
|
|
54
|
+
*/
|
|
55
|
+
function createRuntime(state) {
|
|
56
|
+
const { config, store } = state;
|
|
57
|
+
return {
|
|
58
|
+
async seal(options) {
|
|
59
|
+
const fragment = await createFragment({
|
|
60
|
+
content: options.content,
|
|
61
|
+
source: options.source,
|
|
62
|
+
attribution: options.attribution,
|
|
63
|
+
trust_level: options.trust_level ?? getDefaultTrust(options.attribution, config),
|
|
64
|
+
constraints: options.constraints,
|
|
65
|
+
parent: options.parent,
|
|
66
|
+
signature: options.signature,
|
|
67
|
+
seal_key: config.seal_key,
|
|
68
|
+
});
|
|
69
|
+
// Store the fragment
|
|
70
|
+
await store.put(fragment);
|
|
71
|
+
return fragment;
|
|
72
|
+
},
|
|
73
|
+
async compose(fragments, options) {
|
|
74
|
+
return compose(fragments, options, config.seal_key);
|
|
75
|
+
},
|
|
76
|
+
async resolve(fragment, context) {
|
|
77
|
+
return resolve(fragment, context);
|
|
78
|
+
},
|
|
79
|
+
async verify(fragment) {
|
|
80
|
+
const result = await verifyFragment(fragment, config.seal_key);
|
|
81
|
+
return result.valid;
|
|
82
|
+
},
|
|
83
|
+
get store() {
|
|
84
|
+
return store;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get default trust level for attribution.
|
|
90
|
+
*/
|
|
91
|
+
function getDefaultTrust(attribution, config) {
|
|
92
|
+
switch (attribution) {
|
|
93
|
+
case 'system':
|
|
94
|
+
return 100;
|
|
95
|
+
case 'operator':
|
|
96
|
+
return 90;
|
|
97
|
+
case 'user':
|
|
98
|
+
return 70;
|
|
99
|
+
case 'derived':
|
|
100
|
+
return 60;
|
|
101
|
+
case 'agent':
|
|
102
|
+
return 50;
|
|
103
|
+
case 'external':
|
|
104
|
+
return 30;
|
|
105
|
+
default:
|
|
106
|
+
return config.default_trust;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Create a Caret runtime instance.
|
|
111
|
+
*
|
|
112
|
+
* @param options - Configuration options
|
|
113
|
+
* @returns The Caret runtime
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* const caret = createCaret({
|
|
118
|
+
* seal_key: process.env.CARET_SEAL_KEY!,
|
|
119
|
+
* default_trust: 50,
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export function createCaret(options) {
|
|
124
|
+
if (!options.seal_key) {
|
|
125
|
+
throw new Error('seal_key is required');
|
|
126
|
+
}
|
|
127
|
+
// Enforce minimum key length for security (P5 fix: increased to 32)
|
|
128
|
+
if (options.seal_key.length < 32) {
|
|
129
|
+
throw new Error('seal_key must be at least 32 characters for security');
|
|
130
|
+
}
|
|
131
|
+
// Build config with defaults
|
|
132
|
+
const config = {
|
|
133
|
+
seal_key: options.seal_key,
|
|
134
|
+
default_trust: (options.default_trust ?? 50),
|
|
135
|
+
require_signatures: options.require_signatures ?? false,
|
|
136
|
+
tokenizer: options.tokenizer ?? 'cl100k',
|
|
137
|
+
custom_tokenizer: options.custom_tokenizer,
|
|
138
|
+
};
|
|
139
|
+
// Set up tokenizer if custom provided
|
|
140
|
+
if (options.custom_tokenizer) {
|
|
141
|
+
setTokenizer((content) => {
|
|
142
|
+
const text = typeof content === 'string' ? content : JSON.stringify(content);
|
|
143
|
+
return options.custom_tokenizer(text);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Create or use provided store
|
|
147
|
+
const store = options.store ?? new MemoryStore(config.seal_key);
|
|
148
|
+
return createRuntime({ config, store });
|
|
149
|
+
}
|
|
150
|
+
// Re-export constraint builders
|
|
151
|
+
export { maxAge, notBefore, notAfter, allowDomains, requireTrust, requireSignature, requireInfluence, requireMCCA, } from './resolve.js';
|
|
152
|
+
// Re-export store utilities
|
|
153
|
+
export { MemoryStore, CachedStore, CompositeStore, ExtendedMemoryStore, createStore, } from './store.js';
|
|
154
|
+
// Re-export fragment utilities
|
|
155
|
+
export { verifyFragment, serializeFragment, deserializeFragment, getFragmentAge, getFragmentTrust, isFragmentExpired, countTokens, setTokenizer, } from './fragment.js';
|
|
156
|
+
// Re-export composition utilities
|
|
157
|
+
export { verifyManifold, getManifoldStats, fitsInBudget, parseTokenCeiling, } from './compose.js';
|
|
158
|
+
// Re-export provenance utilities
|
|
159
|
+
export { createProvenanceRecord, createProvenanceChain, extendProvenanceChain, flattenChain, verifyChain, mergeChains, getMinTrust, getMaxTrust, } from './provenance.js';
|
|
160
|
+
// Re-export crypto utilities
|
|
161
|
+
export { sha256, sha256Object, sha256Binary, rollingHash, verifyHash, isValidHash, deterministicStringify, } from './crypto/hash.js';
|
|
162
|
+
export { hmacSeal, hmacVerify, isValidSeal, } from './crypto/hmac.js';
|
|
163
|
+
// Re-export type guards
|
|
164
|
+
export { isHash, isFragmentId, isTimestamp, isTrustLevel, isTokenCount, isContextFragment, isValidInfluenceBudget, isMdashActionCode, sumInfluence, } from './types.js';
|
|
165
|
+
// Re-export research pattern utilities
|
|
166
|
+
export {
|
|
167
|
+
// Atomic encoding
|
|
168
|
+
resolveCoreferences, createDefaultContext, hasUnresolvedCoreferences, extractEntityIds, canonicalEncode, computeCommitmentHash, isValidSubject, isValidTimestamp, } from './utils/atomic.js';
|
|
169
|
+
export {
|
|
170
|
+
// Utility learning
|
|
171
|
+
updateUtilityScore, updateOutcomeUtility, createInitialUtility, createUtilityFromHistory, predictSuccess, expectedUtility, compareUtility, selectBestOutcome, } from './utils/utility.js';
|
|
172
|
+
export {
|
|
173
|
+
// Credit assignment
|
|
174
|
+
assignCredit, validateCreditAssignment, attributeLiability, validateLiabilityShares, createDefaultInfluenceBudget, isMCCACompliant, normalizeInfluenceBudget, addInfluenceBudgets, computeTraceInfluence, } from './utils/credit.js';
|
|
175
|
+
// Version export
|
|
176
|
+
export const VERSION = '3.1.0';
|
|
177
|
+
export const FORMERLY = 'Caret v0.2.0';
|
|
178
|
+
/** Alias for createCaret - use this for new code */
|
|
179
|
+
export const createContext = createCaret;
|
|
180
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caret — Provenance Chain Implementation
|
|
3
|
+
* @module @longarcstudios/caret/provenance
|
|
4
|
+
*
|
|
5
|
+
* Immutable provenance tracking for context fragments.
|
|
6
|
+
* Every fragment knows exactly where it came from.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProvenanceRecord, ProvenanceChain, SourceURI, Attribution, TrustLevel, Timestamp, Hash } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a new ProvenanceRecord.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createProvenanceRecord(options: {
|
|
13
|
+
source: SourceURI | string;
|
|
14
|
+
attribution: Attribution;
|
|
15
|
+
trust_level?: number;
|
|
16
|
+
parent_hash?: Hash | null;
|
|
17
|
+
signature?: string;
|
|
18
|
+
}): Promise<ProvenanceRecord>;
|
|
19
|
+
/**
|
|
20
|
+
* Create a new ProvenanceChain with a single record.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createProvenanceChain(record: ProvenanceRecord): Promise<ProvenanceChain>;
|
|
23
|
+
/**
|
|
24
|
+
* Extend an existing ProvenanceChain with a new record.
|
|
25
|
+
* Returns a new chain (immutable).
|
|
26
|
+
*/
|
|
27
|
+
export declare function extendProvenanceChain(chain: ProvenanceChain, record: ProvenanceRecord): Promise<ProvenanceChain>;
|
|
28
|
+
/**
|
|
29
|
+
* Get all records in the chain as an array (head to tail).
|
|
30
|
+
*/
|
|
31
|
+
export declare function flattenChain(chain: ProvenanceChain): ProvenanceRecord[];
|
|
32
|
+
/**
|
|
33
|
+
* Find a record in the chain by source URI.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findBySource(chain: ProvenanceChain, source: SourceURI | string): ProvenanceRecord | null;
|
|
36
|
+
/**
|
|
37
|
+
* Get the minimum trust level in the chain.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getMinTrust(chain: ProvenanceChain): TrustLevel;
|
|
40
|
+
/**
|
|
41
|
+
* Get the maximum trust level in the chain.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getMaxTrust(chain: ProvenanceChain): TrustLevel;
|
|
44
|
+
/**
|
|
45
|
+
* Check if chain contains a specific attribution type.
|
|
46
|
+
*/
|
|
47
|
+
export declare function hasAttribution(chain: ProvenanceChain, attribution: Attribution): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get all unique attributions in the chain.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getAttributions(chain: ProvenanceChain): Attribution[];
|
|
52
|
+
/**
|
|
53
|
+
* Verify the integrity of a provenance chain.
|
|
54
|
+
* Checks that all hash links are valid.
|
|
55
|
+
*/
|
|
56
|
+
export declare function verifyChain(chain: ProvenanceChain): Promise<{
|
|
57
|
+
valid: boolean;
|
|
58
|
+
errors: string[];
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Merge multiple provenance chains into one.
|
|
62
|
+
* Used when composing multiple fragments into a manifold.
|
|
63
|
+
*
|
|
64
|
+
* Strategy: Creates a new chain with all records, ordered by timestamp.
|
|
65
|
+
*/
|
|
66
|
+
export declare function mergeChains(chains: readonly ProvenanceChain[]): Promise<ProvenanceChain>;
|
|
67
|
+
/**
|
|
68
|
+
* Parse a source string into a SourceURI.
|
|
69
|
+
* Validates the format if strict mode is enabled.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseSourceURI(source: string, strict?: boolean): SourceURI;
|
|
72
|
+
/**
|
|
73
|
+
* Create a timestamp for the current moment.
|
|
74
|
+
*/
|
|
75
|
+
export declare function now(): Timestamp;
|
|
76
|
+
/**
|
|
77
|
+
* Check if a timestamp is expired given a max age.
|
|
78
|
+
*/
|
|
79
|
+
export declare function isExpired(timestamp: Timestamp, maxAgeMs: number): boolean;
|
|
80
|
+
//# sourceMappingURL=provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/context/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,WAAW,EACX,UAAU,EACV,SAAS,EACT,IAAI,EACL,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAW5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,eAAe,CAAC,CAS1B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,EAAE,CAUvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,SAAS,GAAG,MAAM,GACzB,gBAAgB,GAAG,IAAI,CAWzB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAY9D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAY9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,WAAW,GACvB,OAAO,CAWT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,WAAW,EAAE,CAUrE;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAmCD;AAmBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,OAAO,CAAC,eAAe,CAAC,CA+C1B;AAoCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,SAAS,CAUxE;AAED;;GAEG;AACH,wBAAgB,GAAG,IAAI,SAAS,CAE/B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzE"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caret — Provenance Chain Implementation
|
|
3
|
+
* @module @longarcstudios/caret/provenance
|
|
4
|
+
*
|
|
5
|
+
* Immutable provenance tracking for context fragments.
|
|
6
|
+
* Every fragment knows exactly where it came from.
|
|
7
|
+
*/
|
|
8
|
+
import { sha256Object, rollingHash } from './crypto/hash.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// FACTORY FUNCTIONS
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Create a new ProvenanceRecord.
|
|
14
|
+
*/
|
|
15
|
+
export async function createProvenanceRecord(options) {
|
|
16
|
+
const trust = validateTrustLevel(options.trust_level ?? getDefaultTrust(options.attribution));
|
|
17
|
+
return {
|
|
18
|
+
source: options.source,
|
|
19
|
+
attribution: options.attribution,
|
|
20
|
+
trust_level: trust,
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
parent_hash: options.parent_hash ?? null,
|
|
23
|
+
signature: options.signature,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a new ProvenanceChain with a single record.
|
|
28
|
+
*/
|
|
29
|
+
export async function createProvenanceChain(record) {
|
|
30
|
+
const chain_hash = await sha256Object(record);
|
|
31
|
+
return {
|
|
32
|
+
head: record,
|
|
33
|
+
tail: null,
|
|
34
|
+
length: 1,
|
|
35
|
+
chain_hash,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extend an existing ProvenanceChain with a new record.
|
|
40
|
+
* Returns a new chain (immutable).
|
|
41
|
+
*/
|
|
42
|
+
export async function extendProvenanceChain(chain, record) {
|
|
43
|
+
// Update record's parent_hash to point to current chain
|
|
44
|
+
const linkedRecord = {
|
|
45
|
+
...record,
|
|
46
|
+
parent_hash: chain.chain_hash,
|
|
47
|
+
};
|
|
48
|
+
// Compute new chain hash
|
|
49
|
+
const recordHash = await sha256Object(linkedRecord);
|
|
50
|
+
const chain_hash = await rollingHash([chain.chain_hash, recordHash]);
|
|
51
|
+
return {
|
|
52
|
+
head: linkedRecord,
|
|
53
|
+
tail: chain,
|
|
54
|
+
length: chain.length + 1,
|
|
55
|
+
chain_hash,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// CHAIN OPERATIONS
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* Get all records in the chain as an array (head to tail).
|
|
63
|
+
*/
|
|
64
|
+
export function flattenChain(chain) {
|
|
65
|
+
const records = [];
|
|
66
|
+
let current = chain;
|
|
67
|
+
while (current !== null) {
|
|
68
|
+
records.push(current.head);
|
|
69
|
+
current = current.tail;
|
|
70
|
+
}
|
|
71
|
+
return records;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find a record in the chain by source URI.
|
|
75
|
+
*/
|
|
76
|
+
export function findBySource(chain, source) {
|
|
77
|
+
let current = chain;
|
|
78
|
+
while (current !== null) {
|
|
79
|
+
if (current.head.source === source) {
|
|
80
|
+
return current.head;
|
|
81
|
+
}
|
|
82
|
+
current = current.tail;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the minimum trust level in the chain.
|
|
88
|
+
*/
|
|
89
|
+
export function getMinTrust(chain) {
|
|
90
|
+
let min = chain.head.trust_level;
|
|
91
|
+
let current = chain.tail;
|
|
92
|
+
while (current !== null) {
|
|
93
|
+
if (current.head.trust_level < min) {
|
|
94
|
+
min = current.head.trust_level;
|
|
95
|
+
}
|
|
96
|
+
current = current.tail;
|
|
97
|
+
}
|
|
98
|
+
return min;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the maximum trust level in the chain.
|
|
102
|
+
*/
|
|
103
|
+
export function getMaxTrust(chain) {
|
|
104
|
+
let max = chain.head.trust_level;
|
|
105
|
+
let current = chain.tail;
|
|
106
|
+
while (current !== null) {
|
|
107
|
+
if (current.head.trust_level > max) {
|
|
108
|
+
max = current.head.trust_level;
|
|
109
|
+
}
|
|
110
|
+
current = current.tail;
|
|
111
|
+
}
|
|
112
|
+
return max;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if chain contains a specific attribution type.
|
|
116
|
+
*/
|
|
117
|
+
export function hasAttribution(chain, attribution) {
|
|
118
|
+
let current = chain;
|
|
119
|
+
while (current !== null) {
|
|
120
|
+
if (current.head.attribution === attribution) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
current = current.tail;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get all unique attributions in the chain.
|
|
129
|
+
*/
|
|
130
|
+
export function getAttributions(chain) {
|
|
131
|
+
const attributions = new Set();
|
|
132
|
+
let current = chain;
|
|
133
|
+
while (current !== null) {
|
|
134
|
+
attributions.add(current.head.attribution);
|
|
135
|
+
current = current.tail;
|
|
136
|
+
}
|
|
137
|
+
return Array.from(attributions);
|
|
138
|
+
}
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// CHAIN VERIFICATION
|
|
141
|
+
// ============================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Verify the integrity of a provenance chain.
|
|
144
|
+
* Checks that all hash links are valid.
|
|
145
|
+
*/
|
|
146
|
+
export async function verifyChain(chain) {
|
|
147
|
+
const errors = [];
|
|
148
|
+
// Single-record chain
|
|
149
|
+
if (chain.length === 1) {
|
|
150
|
+
const expectedHash = await sha256Object(chain.head);
|
|
151
|
+
if (expectedHash !== chain.chain_hash) {
|
|
152
|
+
errors.push('Chain hash mismatch for single-record chain');
|
|
153
|
+
}
|
|
154
|
+
return { valid: errors.length === 0, errors };
|
|
155
|
+
}
|
|
156
|
+
// Multi-record chain
|
|
157
|
+
let current = chain;
|
|
158
|
+
const recordHashes = [];
|
|
159
|
+
while (current !== null) {
|
|
160
|
+
const recordHash = await sha256Object(current.head);
|
|
161
|
+
recordHashes.unshift(recordHash); // Add to front (we're traversing head to tail)
|
|
162
|
+
// Check parent_hash linkage
|
|
163
|
+
if (current.tail !== null && current.head.parent_hash !== current.tail.chain_hash) {
|
|
164
|
+
errors.push(`Parent hash mismatch at depth ${recordHashes.length}`);
|
|
165
|
+
}
|
|
166
|
+
current = current.tail;
|
|
167
|
+
}
|
|
168
|
+
// Verify rolling hash
|
|
169
|
+
const expectedChainHash = await computeChainHash(chain);
|
|
170
|
+
if (expectedChainHash !== chain.chain_hash) {
|
|
171
|
+
errors.push('Rolling chain hash verification failed');
|
|
172
|
+
}
|
|
173
|
+
return { valid: errors.length === 0, errors };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Recompute the chain hash from records.
|
|
177
|
+
*/
|
|
178
|
+
async function computeChainHash(chain) {
|
|
179
|
+
if (chain.tail === null) {
|
|
180
|
+
return sha256Object(chain.head);
|
|
181
|
+
}
|
|
182
|
+
const tailHash = await computeChainHash(chain.tail);
|
|
183
|
+
const headHash = await sha256Object(chain.head);
|
|
184
|
+
return rollingHash([tailHash, headHash]);
|
|
185
|
+
}
|
|
186
|
+
// ============================================================================
|
|
187
|
+
// CHAIN MERGING
|
|
188
|
+
// ============================================================================
|
|
189
|
+
/**
|
|
190
|
+
* Merge multiple provenance chains into one.
|
|
191
|
+
* Used when composing multiple fragments into a manifold.
|
|
192
|
+
*
|
|
193
|
+
* Strategy: Creates a new chain with all records, ordered by timestamp.
|
|
194
|
+
*/
|
|
195
|
+
export async function mergeChains(chains) {
|
|
196
|
+
if (chains.length === 0) {
|
|
197
|
+
throw new Error('Cannot merge empty chain array');
|
|
198
|
+
}
|
|
199
|
+
if (chains.length === 1) {
|
|
200
|
+
const first = chains[0];
|
|
201
|
+
if (!first)
|
|
202
|
+
throw new Error('Invalid chain');
|
|
203
|
+
return first;
|
|
204
|
+
}
|
|
205
|
+
// Collect all records
|
|
206
|
+
const allRecords = [];
|
|
207
|
+
for (const chain of chains) {
|
|
208
|
+
allRecords.push(...flattenChain(chain));
|
|
209
|
+
}
|
|
210
|
+
// Sort by timestamp (oldest first)
|
|
211
|
+
allRecords.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
212
|
+
// Deduplicate by source + timestamp
|
|
213
|
+
const seen = new Set();
|
|
214
|
+
const uniqueRecords = allRecords.filter(record => {
|
|
215
|
+
const key = `${record.source}:${record.timestamp}`;
|
|
216
|
+
if (seen.has(key))
|
|
217
|
+
return false;
|
|
218
|
+
seen.add(key);
|
|
219
|
+
return true;
|
|
220
|
+
});
|
|
221
|
+
// Build new chain
|
|
222
|
+
const firstRecord = uniqueRecords[0];
|
|
223
|
+
if (!firstRecord) {
|
|
224
|
+
throw new Error('No records to merge');
|
|
225
|
+
}
|
|
226
|
+
let result = await createProvenanceChain(firstRecord);
|
|
227
|
+
for (let i = 1; i < uniqueRecords.length; i++) {
|
|
228
|
+
const record = uniqueRecords[i];
|
|
229
|
+
if (record) {
|
|
230
|
+
result = await extendProvenanceChain(result, record);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// UTILITY FUNCTIONS
|
|
237
|
+
// ============================================================================
|
|
238
|
+
/**
|
|
239
|
+
* Get default trust level for an attribution type.
|
|
240
|
+
*/
|
|
241
|
+
function getDefaultTrust(attribution) {
|
|
242
|
+
switch (attribution) {
|
|
243
|
+
case 'system':
|
|
244
|
+
return 100;
|
|
245
|
+
case 'operator':
|
|
246
|
+
return 90;
|
|
247
|
+
case 'user':
|
|
248
|
+
return 70;
|
|
249
|
+
case 'derived':
|
|
250
|
+
return 60;
|
|
251
|
+
case 'agent':
|
|
252
|
+
return 50;
|
|
253
|
+
case 'external':
|
|
254
|
+
return 30;
|
|
255
|
+
default:
|
|
256
|
+
return 50;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Validate and clamp trust level to 0-100.
|
|
261
|
+
*/
|
|
262
|
+
function validateTrustLevel(value) {
|
|
263
|
+
const clamped = Math.max(0, Math.min(100, Math.round(value)));
|
|
264
|
+
return clamped;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Parse a source string into a SourceURI.
|
|
268
|
+
* Validates the format if strict mode is enabled.
|
|
269
|
+
*/
|
|
270
|
+
export function parseSourceURI(source, strict = false) {
|
|
271
|
+
if (strict) {
|
|
272
|
+
// Validate URI format: scheme://path
|
|
273
|
+
const uriPattern = /^[a-z][a-z0-9+.-]*:\/\/.+$/i;
|
|
274
|
+
if (!uriPattern.test(source)) {
|
|
275
|
+
throw new Error('Invalid source URI format');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return source;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Create a timestamp for the current moment.
|
|
282
|
+
*/
|
|
283
|
+
export function now() {
|
|
284
|
+
return new Date().toISOString();
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check if a timestamp is expired given a max age.
|
|
288
|
+
*/
|
|
289
|
+
export function isExpired(timestamp, maxAgeMs) {
|
|
290
|
+
const then = new Date(timestamp).getTime();
|
|
291
|
+
const now = Date.now();
|
|
292
|
+
return (now - then) > maxAgeMs;
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/context/provenance.ts"],"names":[],"mappings":"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"}
|