@private.me/xcontinuity 2.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.
Files changed (59) hide show
  1. package/AGENTS.md +123 -0
  2. package/LICENSE.md +26 -0
  3. package/MIGRATING.md +77 -0
  4. package/README.md +601 -0
  5. package/dist/adjudicator.d.ts +75 -0
  6. package/dist/adjudicator.js +184 -0
  7. package/dist/cascade.d.ts +157 -0
  8. package/dist/cascade.js +323 -0
  9. package/dist/chronicle.d.ts +76 -0
  10. package/dist/chronicle.js +173 -0
  11. package/dist/cjs/adjudicator.js +189 -0
  12. package/dist/cjs/cascade.js +328 -0
  13. package/dist/cjs/chronicle.js +178 -0
  14. package/dist/cjs/enforcement.js +108 -0
  15. package/dist/cjs/errors.js +72 -0
  16. package/dist/cjs/index.js +108 -0
  17. package/dist/cjs/memory-runtime.js +129 -0
  18. package/dist/cjs/memory-session.js +134 -0
  19. package/dist/cjs/mission.js +178 -0
  20. package/dist/cjs/package.json +1 -0
  21. package/dist/cjs/provenance.js +192 -0
  22. package/dist/cjs/ratification.js +322 -0
  23. package/dist/cjs/reverse-xorida.js +506 -0
  24. package/dist/cjs/session.js +273 -0
  25. package/dist/cjs/state-serializer.js +300 -0
  26. package/dist/cjs/store-memory.js +33 -0
  27. package/dist/cjs/trust.js +133 -0
  28. package/dist/cjs/types.js +59 -0
  29. package/dist/enforcement.d.ts +40 -0
  30. package/dist/enforcement.js +104 -0
  31. package/dist/errors.d.ts +25 -0
  32. package/dist/errors.js +68 -0
  33. package/dist/index.d.ts +34 -0
  34. package/dist/index.js +43 -0
  35. package/dist/memory-runtime.d.ts +36 -0
  36. package/dist/memory-runtime.js +125 -0
  37. package/dist/memory-session.d.ts +38 -0
  38. package/dist/memory-session.js +97 -0
  39. package/dist/mission.d.ts +68 -0
  40. package/dist/mission.js +172 -0
  41. package/dist/provenance.d.ts +54 -0
  42. package/dist/provenance.js +182 -0
  43. package/dist/ratification.d.ts +113 -0
  44. package/dist/ratification.js +317 -0
  45. package/dist/reverse-xorida.d.ts +174 -0
  46. package/dist/reverse-xorida.js +490 -0
  47. package/dist/session.d.ts +102 -0
  48. package/dist/session.js +269 -0
  49. package/dist/state-serializer.d.ts +37 -0
  50. package/dist/state-serializer.js +294 -0
  51. package/dist/store-memory.d.ts +18 -0
  52. package/dist/store-memory.js +29 -0
  53. package/dist/trust.d.ts +76 -0
  54. package/dist/trust.js +121 -0
  55. package/dist/types.d.ts +320 -0
  56. package/dist/types.js +56 -0
  57. package/llms.txt +43 -0
  58. package/package.json +125 -0
  59. package/share1.dat +0 -0
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * @private.me/xcontinuity
4
+ *
5
+ * Cryptographic state continuity for AI agents.
6
+ * Reverse-XorIDA incremental state updates over GF(2).
7
+ * Trust substrate with provenance, tiers, and enforcement.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.compareTiers = exports.effectiveTier = exports.applyDecay = exports.isDecayed = exports.applyContradictionDowngrade = exports.baselineTier = exports.verifyChainLink = exports.hashProvenance = exports.verifyEntry = exports.signEntry = exports.canonicalEntryBytes = exports.authorRefToPublicKey = exports.publicKeyToAuthorRef = exports.generateSigningKeyPair = exports.SessionManager = exports.detectContradiction = exports.Chronicle = exports.SessionMemory = exports.RuntimeMemory = exports.MemoryStateStore = exports.networkDecodeShare = exports.networkCodeShares = exports.blindEqual = exports.refreshShares = exports.blindUpdateShare = exports.squashDeltas = exports.branchState = exports.undoDelta = exports.padForSplit = exports.incrementalUpdate = exports.applyDeltaShares = exports.computeDelta = exports.reconstructState = exports.splitState = exports.statesEqual = exports.computeChecksum = exports.deserializeState = exports.serializeState = exports.ERROR_DETAILS = exports.continuityError = exports.DEFAULT_ENFORCEMENT_CONFIG = exports.DEFAULT_MAX_AGE = exports.TRUST_TIER_RANK = exports.DEFAULT_RUNTIME_MEMORY_CONFIG = exports.DEFAULT_SPLIT_CONFIG = exports.VALUE_TYPE = exports.CONTINUITY_TLV = exports.err = exports.ok = exports.VERSION = void 0;
11
+ exports.DEFAULT_COORDINATOR_CONFIG = exports.DEFAULT_CASCADE_POLICY = exports.SubAgentCoordinator = exports.CascadeSession = exports.EnforcementLoop = exports.AlignmentAdjudicator = exports.MissionGuard = exports.MissionAuthority = exports.Hypothesis = exports.TrustStore = exports.ConsensusAdjudicator = exports.PolicyAdjudicator = exports.leastTrusted = exports.isMoreTrusted = void 0;
12
+ exports.VERSION = '2.1.0';
13
+ var shared_1 = require("@private.me/shared");
14
+ Object.defineProperty(exports, "ok", { enumerable: true, get: function () { return shared_1.ok; } });
15
+ Object.defineProperty(exports, "err", { enumerable: true, get: function () { return shared_1.err; } });
16
+ var types_js_1 = require("./types.js");
17
+ Object.defineProperty(exports, "CONTINUITY_TLV", { enumerable: true, get: function () { return types_js_1.CONTINUITY_TLV; } });
18
+ Object.defineProperty(exports, "VALUE_TYPE", { enumerable: true, get: function () { return types_js_1.VALUE_TYPE; } });
19
+ Object.defineProperty(exports, "DEFAULT_SPLIT_CONFIG", { enumerable: true, get: function () { return types_js_1.DEFAULT_SPLIT_CONFIG; } });
20
+ Object.defineProperty(exports, "DEFAULT_RUNTIME_MEMORY_CONFIG", { enumerable: true, get: function () { return types_js_1.DEFAULT_RUNTIME_MEMORY_CONFIG; } });
21
+ // Trust Substrate constants (v2.0.0)
22
+ Object.defineProperty(exports, "TRUST_TIER_RANK", { enumerable: true, get: function () { return types_js_1.TRUST_TIER_RANK; } });
23
+ Object.defineProperty(exports, "DEFAULT_MAX_AGE", { enumerable: true, get: function () { return types_js_1.DEFAULT_MAX_AGE; } });
24
+ Object.defineProperty(exports, "DEFAULT_ENFORCEMENT_CONFIG", { enumerable: true, get: function () { return types_js_1.DEFAULT_ENFORCEMENT_CONFIG; } });
25
+ var errors_js_1 = require("./errors.js");
26
+ Object.defineProperty(exports, "continuityError", { enumerable: true, get: function () { return errors_js_1.continuityError; } });
27
+ Object.defineProperty(exports, "ERROR_DETAILS", { enumerable: true, get: function () { return errors_js_1.ERROR_DETAILS; } });
28
+ /* ── State Serializer ── */
29
+ var state_serializer_js_1 = require("./state-serializer.js");
30
+ Object.defineProperty(exports, "serializeState", { enumerable: true, get: function () { return state_serializer_js_1.serializeState; } });
31
+ Object.defineProperty(exports, "deserializeState", { enumerable: true, get: function () { return state_serializer_js_1.deserializeState; } });
32
+ Object.defineProperty(exports, "computeChecksum", { enumerable: true, get: function () { return state_serializer_js_1.computeChecksum; } });
33
+ Object.defineProperty(exports, "statesEqual", { enumerable: true, get: function () { return state_serializer_js_1.statesEqual; } });
34
+ /* ── Reverse-XorIDA ── */
35
+ var reverse_xorida_js_1 = require("./reverse-xorida.js");
36
+ Object.defineProperty(exports, "splitState", { enumerable: true, get: function () { return reverse_xorida_js_1.splitState; } });
37
+ Object.defineProperty(exports, "reconstructState", { enumerable: true, get: function () { return reverse_xorida_js_1.reconstructState; } });
38
+ Object.defineProperty(exports, "computeDelta", { enumerable: true, get: function () { return reverse_xorida_js_1.computeDelta; } });
39
+ Object.defineProperty(exports, "applyDeltaShares", { enumerable: true, get: function () { return reverse_xorida_js_1.applyDeltaShares; } });
40
+ Object.defineProperty(exports, "incrementalUpdate", { enumerable: true, get: function () { return reverse_xorida_js_1.incrementalUpdate; } });
41
+ Object.defineProperty(exports, "padForSplit", { enumerable: true, get: function () { return reverse_xorida_js_1.padForSplit; } });
42
+ // Algebraic extensions (v2.0.0)
43
+ Object.defineProperty(exports, "undoDelta", { enumerable: true, get: function () { return reverse_xorida_js_1.undoDelta; } });
44
+ Object.defineProperty(exports, "branchState", { enumerable: true, get: function () { return reverse_xorida_js_1.branchState; } });
45
+ Object.defineProperty(exports, "squashDeltas", { enumerable: true, get: function () { return reverse_xorida_js_1.squashDeltas; } });
46
+ Object.defineProperty(exports, "blindUpdateShare", { enumerable: true, get: function () { return reverse_xorida_js_1.blindUpdateShare; } });
47
+ Object.defineProperty(exports, "refreshShares", { enumerable: true, get: function () { return reverse_xorida_js_1.refreshShares; } });
48
+ Object.defineProperty(exports, "blindEqual", { enumerable: true, get: function () { return reverse_xorida_js_1.blindEqual; } });
49
+ Object.defineProperty(exports, "networkCodeShares", { enumerable: true, get: function () { return reverse_xorida_js_1.networkCodeShares; } });
50
+ Object.defineProperty(exports, "networkDecodeShare", { enumerable: true, get: function () { return reverse_xorida_js_1.networkDecodeShare; } });
51
+ /* ── Store ── */
52
+ var store_memory_js_1 = require("./store-memory.js");
53
+ Object.defineProperty(exports, "MemoryStateStore", { enumerable: true, get: function () { return store_memory_js_1.MemoryStateStore; } });
54
+ /* ── Memory Layers ── */
55
+ var memory_runtime_js_1 = require("./memory-runtime.js");
56
+ Object.defineProperty(exports, "RuntimeMemory", { enumerable: true, get: function () { return memory_runtime_js_1.RuntimeMemory; } });
57
+ var memory_session_js_1 = require("./memory-session.js");
58
+ Object.defineProperty(exports, "SessionMemory", { enumerable: true, get: function () { return memory_session_js_1.SessionMemory; } });
59
+ /* ── Chronicle ── */
60
+ var chronicle_js_1 = require("./chronicle.js");
61
+ Object.defineProperty(exports, "Chronicle", { enumerable: true, get: function () { return chronicle_js_1.Chronicle; } });
62
+ Object.defineProperty(exports, "detectContradiction", { enumerable: true, get: function () { return chronicle_js_1.detectContradiction; } });
63
+ /* ── Session Manager ── */
64
+ var session_js_1 = require("./session.js");
65
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_js_1.SessionManager; } });
66
+ /* ── Trust Substrate (v2.0.0) ── */
67
+ // Provenance
68
+ var provenance_js_1 = require("./provenance.js");
69
+ Object.defineProperty(exports, "generateSigningKeyPair", { enumerable: true, get: function () { return provenance_js_1.generateSigningKeyPair; } });
70
+ Object.defineProperty(exports, "publicKeyToAuthorRef", { enumerable: true, get: function () { return provenance_js_1.publicKeyToAuthorRef; } });
71
+ Object.defineProperty(exports, "authorRefToPublicKey", { enumerable: true, get: function () { return provenance_js_1.authorRefToPublicKey; } });
72
+ Object.defineProperty(exports, "canonicalEntryBytes", { enumerable: true, get: function () { return provenance_js_1.canonicalEntryBytes; } });
73
+ Object.defineProperty(exports, "signEntry", { enumerable: true, get: function () { return provenance_js_1.signEntry; } });
74
+ Object.defineProperty(exports, "verifyEntry", { enumerable: true, get: function () { return provenance_js_1.verifyEntry; } });
75
+ Object.defineProperty(exports, "hashProvenance", { enumerable: true, get: function () { return provenance_js_1.hashProvenance; } });
76
+ Object.defineProperty(exports, "verifyChainLink", { enumerable: true, get: function () { return provenance_js_1.verifyChainLink; } });
77
+ // Trust Tiers
78
+ var trust_js_1 = require("./trust.js");
79
+ Object.defineProperty(exports, "baselineTier", { enumerable: true, get: function () { return trust_js_1.baselineTier; } });
80
+ Object.defineProperty(exports, "applyContradictionDowngrade", { enumerable: true, get: function () { return trust_js_1.applyContradictionDowngrade; } });
81
+ Object.defineProperty(exports, "isDecayed", { enumerable: true, get: function () { return trust_js_1.isDecayed; } });
82
+ Object.defineProperty(exports, "applyDecay", { enumerable: true, get: function () { return trust_js_1.applyDecay; } });
83
+ Object.defineProperty(exports, "effectiveTier", { enumerable: true, get: function () { return trust_js_1.effectiveTier; } });
84
+ Object.defineProperty(exports, "compareTiers", { enumerable: true, get: function () { return trust_js_1.compareTiers; } });
85
+ Object.defineProperty(exports, "isMoreTrusted", { enumerable: true, get: function () { return trust_js_1.isMoreTrusted; } });
86
+ Object.defineProperty(exports, "leastTrusted", { enumerable: true, get: function () { return trust_js_1.leastTrusted; } });
87
+ // Adjudicator
88
+ var adjudicator_js_1 = require("./adjudicator.js");
89
+ Object.defineProperty(exports, "PolicyAdjudicator", { enumerable: true, get: function () { return adjudicator_js_1.PolicyAdjudicator; } });
90
+ Object.defineProperty(exports, "ConsensusAdjudicator", { enumerable: true, get: function () { return adjudicator_js_1.ConsensusAdjudicator; } });
91
+ // Ratification (TrustStore)
92
+ var ratification_js_1 = require("./ratification.js");
93
+ Object.defineProperty(exports, "TrustStore", { enumerable: true, get: function () { return ratification_js_1.TrustStore; } });
94
+ Object.defineProperty(exports, "Hypothesis", { enumerable: true, get: function () { return ratification_js_1.Hypothesis; } });
95
+ // Mission
96
+ var mission_js_1 = require("./mission.js");
97
+ Object.defineProperty(exports, "MissionAuthority", { enumerable: true, get: function () { return mission_js_1.MissionAuthority; } });
98
+ Object.defineProperty(exports, "MissionGuard", { enumerable: true, get: function () { return mission_js_1.MissionGuard; } });
99
+ Object.defineProperty(exports, "AlignmentAdjudicator", { enumerable: true, get: function () { return mission_js_1.AlignmentAdjudicator; } });
100
+ // Enforcement
101
+ var enforcement_js_1 = require("./enforcement.js");
102
+ Object.defineProperty(exports, "EnforcementLoop", { enumerable: true, get: function () { return enforcement_js_1.EnforcementLoop; } });
103
+ /* ── Cascade / Sub-Agent Architecture (v2.1.0) ── */
104
+ var cascade_js_1 = require("./cascade.js");
105
+ Object.defineProperty(exports, "CascadeSession", { enumerable: true, get: function () { return cascade_js_1.CascadeSession; } });
106
+ Object.defineProperty(exports, "SubAgentCoordinator", { enumerable: true, get: function () { return cascade_js_1.SubAgentCoordinator; } });
107
+ Object.defineProperty(exports, "DEFAULT_CASCADE_POLICY", { enumerable: true, get: function () { return cascade_js_1.DEFAULT_CASCADE_POLICY; } });
108
+ Object.defineProperty(exports, "DEFAULT_COORDINATOR_CONFIG", { enumerable: true, get: function () { return cascade_js_1.DEFAULT_COORDINATOR_CONFIG; } });
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * @private.me/xcontinuity — Runtime Memory Layer
4
+ *
5
+ * In-process ephemeral key-value store backed by Map<string, RuntimeEntry>.
6
+ * Tracks access counts and update times. LRU eviction at configurable maxEntries.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RuntimeMemory = void 0;
10
+ const types_js_1 = require("./types.js");
11
+ class RuntimeMemory {
12
+ entries = new Map();
13
+ config;
14
+ constructor(config = {}) {
15
+ this.config = { ...types_js_1.DEFAULT_RUNTIME_MEMORY_CONFIG, ...config };
16
+ }
17
+ /** Get a value by key. Returns undefined if not found. Updates access count. */
18
+ get(key) {
19
+ const entry = this.entries.get(key);
20
+ if (!entry)
21
+ return undefined;
22
+ // Update access count (create new entry for immutability of the interface)
23
+ const updated = {
24
+ ...entry,
25
+ accessCount: entry.accessCount + 1,
26
+ };
27
+ this.entries.set(key, updated);
28
+ return entry.value;
29
+ }
30
+ /** Set a value. Evicts LRU entry if at capacity. */
31
+ set(key, value) {
32
+ const now = Date.now();
33
+ const existing = this.entries.get(key);
34
+ if (existing) {
35
+ this.entries.set(key, {
36
+ ...existing,
37
+ value,
38
+ accessCount: existing.accessCount + 1,
39
+ updatedAt: now,
40
+ });
41
+ return;
42
+ }
43
+ // Evict if at capacity
44
+ if (this.entries.size >= this.config.maxEntries) {
45
+ this.evictLRU();
46
+ }
47
+ this.entries.set(key, {
48
+ key,
49
+ value,
50
+ accessCount: 1,
51
+ createdAt: now,
52
+ updatedAt: now,
53
+ });
54
+ }
55
+ /** Delete a key. Returns true if the key existed. */
56
+ delete(key) {
57
+ return this.entries.delete(key);
58
+ }
59
+ /** Check if a key exists. */
60
+ has(key) {
61
+ return this.entries.has(key);
62
+ }
63
+ /** Get all keys. */
64
+ keys() {
65
+ return Array.from(this.entries.keys());
66
+ }
67
+ /** Number of entries. */
68
+ get size() {
69
+ return this.entries.size;
70
+ }
71
+ /** Export all entries as an AgentState (flat key-value map). */
72
+ toAgentState() {
73
+ const state = {};
74
+ for (const [key, entry] of this.entries) {
75
+ state[key] = entry.value;
76
+ }
77
+ return state;
78
+ }
79
+ /** Import from an AgentState, replacing all entries. */
80
+ fromAgentState(state) {
81
+ this.entries.clear();
82
+ const now = Date.now();
83
+ for (const [key, value] of Object.entries(state)) {
84
+ if (value === undefined)
85
+ continue;
86
+ this.entries.set(key, {
87
+ key,
88
+ value,
89
+ accessCount: 0,
90
+ createdAt: now,
91
+ updatedAt: now,
92
+ });
93
+ }
94
+ }
95
+ /** Merge an AgentState into existing entries (existing keys updated, new keys added). */
96
+ merge(state) {
97
+ for (const [key, value] of Object.entries(state)) {
98
+ if (value === undefined)
99
+ continue;
100
+ this.set(key, value);
101
+ }
102
+ }
103
+ /** Get the RuntimeEntry metadata for a key (for inspection/testing). */
104
+ getEntry(key) {
105
+ return this.entries.get(key);
106
+ }
107
+ /** Clear all entries. */
108
+ clear() {
109
+ this.entries.clear();
110
+ }
111
+ /** Evict the least-recently-used entry (lowest accessCount, oldest updatedAt). */
112
+ evictLRU() {
113
+ let lruKey = null;
114
+ let lruAccess = Infinity;
115
+ let lruTime = Infinity;
116
+ for (const [key, entry] of this.entries) {
117
+ if (entry.accessCount < lruAccess ||
118
+ (entry.accessCount === lruAccess && entry.updatedAt < lruTime)) {
119
+ lruKey = key;
120
+ lruAccess = entry.accessCount;
121
+ lruTime = entry.updatedAt;
122
+ }
123
+ }
124
+ if (lruKey !== null) {
125
+ this.entries.delete(lruKey);
126
+ }
127
+ }
128
+ }
129
+ exports.RuntimeMemory = RuntimeMemory;
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * @private.me/xcontinuity — Session Memory Layer
4
+ *
5
+ * Orchestration layer over serializer + reverse-xorida + store.
6
+ * Maintains lastSplitState for incremental updates.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.SessionMemory = void 0;
43
+ const shared_1 = require("@private.me/shared");
44
+ const types_js_1 = require("./types.js");
45
+ const errors_js_1 = require("./errors.js");
46
+ const state_serializer_js_1 = require("./state-serializer.js");
47
+ const reverse_xorida_js_1 = require("./reverse-xorida.js");
48
+ class SessionMemory {
49
+ lastSplitState = null;
50
+ lastSnapshot = null;
51
+ store;
52
+ splitConfig;
53
+ constructor(store, splitConfig = types_js_1.DEFAULT_SPLIT_CONFIG) {
54
+ this.store = store;
55
+ this.splitConfig = splitConfig;
56
+ }
57
+ /**
58
+ * Save agent state: serialize, split (incremental if possible), persist to store.
59
+ *
60
+ * @param state - Agent state to persist
61
+ * @param metadata - State metadata
62
+ * @returns The state snapshot (with stateId for later retrieval)
63
+ */
64
+ async save(state, metadata) {
65
+ // Serialize
66
+ const serResult = await (0, state_serializer_js_1.serializeState)(state, metadata);
67
+ if (!serResult.ok)
68
+ return serResult;
69
+ const snapshot = serResult.value;
70
+ // Split (incremental if we have a previous split)
71
+ let splitResult;
72
+ if (this.lastSplitState && this.lastSnapshot) {
73
+ splitResult = await (0, reverse_xorida_js_1.incrementalUpdate)(this.lastSplitState, this.lastSnapshot, snapshot);
74
+ }
75
+ else {
76
+ splitResult = await (0, reverse_xorida_js_1.splitState)(snapshot, this.splitConfig);
77
+ }
78
+ if (!splitResult.ok)
79
+ return splitResult;
80
+ // Persist to store
81
+ await this.store.putShares(splitResult.value);
82
+ // Update tracking
83
+ this.lastSplitState = splitResult.value;
84
+ this.lastSnapshot = snapshot;
85
+ return (0, shared_1.ok)(snapshot);
86
+ }
87
+ /**
88
+ * Load agent state from store by stateId.
89
+ * If no stateId provided, uses the last saved state.
90
+ *
91
+ * @param stateId - Optional state ID to load (defaults to last saved)
92
+ * @returns Reconstructed AgentState
93
+ */
94
+ async load(stateId) {
95
+ const targetId = stateId ?? this.lastSplitState?.stateId;
96
+ if (!targetId) {
97
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('NO_SNAPSHOTS', 'No state ID provided and no previous save'));
98
+ }
99
+ const splitState = await this.store.getShares(targetId);
100
+ if (!splitState) {
101
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('SNAPSHOT_NOT_FOUND', `State ${targetId} not found in store`));
102
+ }
103
+ // Reconstruct from shares
104
+ const reconResult = await (0, reverse_xorida_js_1.reconstructState)(splitState.shares);
105
+ if (!reconResult.ok)
106
+ return reconResult;
107
+ // Deserialize the snapshot
108
+ const snapshot = {
109
+ stateId: reconResult.value.stateId,
110
+ metadata: splitState.metadata,
111
+ serializedBytes: reconResult.value.serializedBytes,
112
+ checksum: new Uint8Array(0), // Will be recomputed during deserialization
113
+ };
114
+ // Compute fresh checksum for verification
115
+ const { computeChecksum } = await Promise.resolve().then(() => __importStar(require('./state-serializer.js')));
116
+ const freshChecksum = await computeChecksum(reconResult.value.serializedBytes);
117
+ const verifiedSnapshot = { ...snapshot, checksum: freshChecksum };
118
+ return (0, state_serializer_js_1.deserializeState)(verifiedSnapshot);
119
+ }
120
+ /** Get the last split state (for inspection/testing). */
121
+ getLastSplitState() {
122
+ return this.lastSplitState;
123
+ }
124
+ /** Get the last snapshot (for inspection/testing). */
125
+ getLastSnapshot() {
126
+ return this.lastSnapshot;
127
+ }
128
+ /** Reset internal tracking state. */
129
+ reset() {
130
+ this.lastSplitState = null;
131
+ this.lastSnapshot = null;
132
+ }
133
+ }
134
+ exports.SessionMemory = SessionMemory;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * @private.me/xcontinuity — Mission (Human-Anchored Goals)
4
+ *
5
+ * Ensures AI agents operate within human-defined boundaries.
6
+ *
7
+ * Components:
8
+ * MissionAuthority — validates mission signatures, checks expiry/scope
9
+ * MissionGuard — pre-write check against active mission constraints
10
+ * AlignmentAdjudicator — wraps any Adjudicator, adding mission checks
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AlignmentAdjudicator = exports.MissionGuard = exports.MissionAuthority = void 0;
14
+ const shared_1 = require("@private.me/shared");
15
+ const errors_js_1 = require("./errors.js");
16
+ const provenance_js_1 = require("./provenance.js");
17
+ /**
18
+ * Validates mission records and checks authority.
19
+ */
20
+ class MissionAuthority {
21
+ activeMission = null;
22
+ /**
23
+ * Load a mission record after verifying its signature and validity.
24
+ */
25
+ async loadMission(mission) {
26
+ // Check expiry
27
+ if (mission.expiresAt !== undefined && Date.now() > mission.expiresAt) {
28
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('AUTHORITY_EXPIRED', `Mission ${mission.missionId} has expired`));
29
+ }
30
+ // Verify signature
31
+ try {
32
+ const publicKey = await (0, provenance_js_1.authorRefToPublicKey)(mission.authority);
33
+ const encoder = new TextEncoder();
34
+ const missionBytes = encoder.encode(canonicalMissionString(mission));
35
+ const valid = await crypto.subtle.verify('Ed25519', publicKey, mission.signature.buffer, missionBytes.buffer);
36
+ if (!valid) {
37
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('INVALID_MISSION_SIGNATURE', `Mission ${mission.missionId} signature invalid`));
38
+ }
39
+ }
40
+ catch (e) {
41
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('INVALID_MISSION_SIGNATURE', `Signature verification failed: ${e instanceof Error ? e.message : String(e)}`));
42
+ }
43
+ this.activeMission = mission;
44
+ return (0, shared_1.ok)(undefined);
45
+ }
46
+ /**
47
+ * Load a mission without signature verification (for testing or trusted sources).
48
+ */
49
+ loadTrustedMission(mission) {
50
+ this.activeMission = mission;
51
+ }
52
+ /** Get the active mission. */
53
+ getActiveMission() {
54
+ return this.activeMission;
55
+ }
56
+ /** Clear the active mission. */
57
+ clearMission() {
58
+ this.activeMission = null;
59
+ }
60
+ /**
61
+ * Check if an action falls within the active mission's scopes.
62
+ */
63
+ isInScope(action) {
64
+ if (!this.activeMission) {
65
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('NO_ACTIVE_MISSION', 'No mission loaded'));
66
+ }
67
+ // Check expiry
68
+ if (this.activeMission.expiresAt !== undefined && Date.now() > this.activeMission.expiresAt) {
69
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('AUTHORITY_EXPIRED', `Mission ${this.activeMission.missionId} has expired`));
70
+ }
71
+ // Empty scopes = all actions allowed
72
+ if (this.activeMission.scopes.length === 0) {
73
+ return (0, shared_1.ok)(true);
74
+ }
75
+ // Check if action type or key matches any scope
76
+ const actionScope = `${action.type}:${action.key}`;
77
+ const inScope = this.activeMission.scopes.some(scope => actionScope.startsWith(scope) || action.type === scope || scope === '*');
78
+ return (0, shared_1.ok)(inScope);
79
+ }
80
+ }
81
+ exports.MissionAuthority = MissionAuthority;
82
+ /**
83
+ * Pre-write guard that evaluates actions against mission constraints.
84
+ */
85
+ class MissionGuard {
86
+ authority;
87
+ constraints = [];
88
+ constructor(authority) {
89
+ this.authority = authority;
90
+ }
91
+ /** Add a hard constraint. */
92
+ addConstraint(constraint) {
93
+ this.constraints.push(constraint);
94
+ }
95
+ /** Remove a constraint by ID. */
96
+ removeConstraint(constraintId) {
97
+ const idx = this.constraints.findIndex(c => c.constraintId === constraintId);
98
+ if (idx === -1)
99
+ return false;
100
+ this.constraints.splice(idx, 1);
101
+ return true;
102
+ }
103
+ /** Get all active constraints. */
104
+ getConstraints() {
105
+ return this.constraints.slice();
106
+ }
107
+ /**
108
+ * Evaluate a proposed action against all constraints and mission scope.
109
+ *
110
+ * @returns ConstraintResult — allowed:true if all pass, or first violation
111
+ */
112
+ evaluate(action) {
113
+ // Check mission scope first
114
+ const scopeResult = this.authority.isInScope(action);
115
+ if (!scopeResult.ok)
116
+ return scopeResult;
117
+ if (!scopeResult.value) {
118
+ return (0, shared_1.ok)({
119
+ allowed: false,
120
+ reason: `Action "${action.type}:${action.key}" is outside mission scope`,
121
+ });
122
+ }
123
+ // Evaluate each constraint
124
+ for (const constraint of this.constraints) {
125
+ const result = constraint.evaluate(action);
126
+ if (!result.allowed) {
127
+ return (0, shared_1.ok)(result);
128
+ }
129
+ }
130
+ return (0, shared_1.ok)({ allowed: true });
131
+ }
132
+ }
133
+ exports.MissionGuard = MissionGuard;
134
+ /**
135
+ * Adjudicator wrapper that adds mission constraint checking.
136
+ *
137
+ * Delegates resolution to the inner adjudicator, but rejects
138
+ * any winning entry that violates active mission constraints.
139
+ */
140
+ class AlignmentAdjudicator {
141
+ inner;
142
+ guard;
143
+ constructor(inner, guard) {
144
+ this.inner = inner;
145
+ this.guard = guard;
146
+ }
147
+ resolve(key, candidates) {
148
+ const result = this.inner.resolve(key, candidates);
149
+ if (!result.ok)
150
+ return result;
151
+ // Check if winning entry passes mission constraints
152
+ const action = {
153
+ author: result.value.winner.provenance?.author ?? '',
154
+ type: 'write',
155
+ key,
156
+ value: result.value.winner.value,
157
+ };
158
+ const guardResult = this.guard.evaluate(action);
159
+ if (!guardResult.ok)
160
+ return guardResult;
161
+ if (!guardResult.value.allowed) {
162
+ return (0, shared_1.err)((0, errors_js_1.continuityError)('CONSTRAINT_VIOLATION', `Winner for "${key}" violates constraint: ${guardResult.value.reason}`));
163
+ }
164
+ return result;
165
+ }
166
+ }
167
+ exports.AlignmentAdjudicator = AlignmentAdjudicator;
168
+ /* ── Internal helpers ── */
169
+ function canonicalMissionString(mission) {
170
+ return [
171
+ mission.missionId,
172
+ mission.goal,
173
+ mission.authority,
174
+ String(mission.issuedAt),
175
+ String(mission.expiresAt ?? ''),
176
+ [...mission.scopes].sort().join(','),
177
+ ].join('\0');
178
+ }
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}