@prmichaelsen/remember-core 0.12.0 → 0.13.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/README.md +13 -3
- package/dist/services/access-control.service.d.ts +140 -0
- package/dist/services/access-control.service.d.ts.map +1 -0
- package/dist/services/access-control.service.js +257 -0
- package/dist/services/access-control.service.js.map +1 -0
- package/dist/services/escalation.service.d.ts +25 -0
- package/dist/services/escalation.service.d.ts.map +1 -0
- package/dist/services/escalation.service.js +119 -0
- package/dist/services/escalation.service.js.map +1 -0
- package/dist/services/ghost-config-handler.service.d.ts +46 -0
- package/dist/services/ghost-config-handler.service.d.ts.map +1 -0
- package/dist/services/ghost-config-handler.service.js +100 -0
- package/dist/services/ghost-config-handler.service.js.map +1 -0
- package/dist/services/ghost-config.service.d.ts +58 -0
- package/dist/services/ghost-config.service.d.ts.map +1 -0
- package/dist/services/ghost-config.service.js +180 -0
- package/dist/services/ghost-config.service.js.map +1 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/trust-enforcement.service.d.ts +80 -0
- package/dist/services/trust-enforcement.service.d.ts.map +1 -0
- package/dist/services/trust-enforcement.service.js +174 -0
- package/dist/services/trust-enforcement.service.js.map +1 -0
- package/dist/services/trust-validator.service.d.ts +43 -0
- package/dist/services/trust-validator.service.d.ts.map +1 -0
- package/dist/services/trust-validator.service.js +86 -0
- package/dist/services/trust-validator.service.js.map +1 -0
- package/dist/types/access-result.types.d.ts +48 -0
- package/dist/types/access-result.types.d.ts.map +1 -0
- package/dist/types/access-result.types.js +6 -0
- package/dist/types/access-result.types.js.map +1 -0
- package/dist/types/auth.types.d.ts +11 -0
- package/dist/types/auth.types.d.ts.map +1 -1
- package/dist/types/ghost-config.types.d.ts +36 -0
- package/dist/types/ghost-config.types.d.ts.map +1 -0
- package/dist/types/ghost-config.types.js +19 -0
- package/dist/types/ghost-config.types.js.map +1 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.types.d.ts +7 -0
- package/dist/types/memory.types.d.ts.map +1 -1
- package/dist/utils/filters.d.ts +14 -0
- package/dist/utils/filters.d.ts.map +1 -1
- package/dist/utils/filters.js +22 -0
- package/dist/utils/filters.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ghost Config Handler — orchestration layer for ghost config operations.
|
|
3
|
+
*
|
|
4
|
+
* Thin business logic layer that validates inputs and delegates to
|
|
5
|
+
* GhostConfigService functions. Separates orchestration from storage.
|
|
6
|
+
*
|
|
7
|
+
* Ported from remember-mcp/src/tools/ghost-config.ts (business logic only).
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from '../utils/logger.js';
|
|
10
|
+
import type { GhostConfig } from '../types/ghost-config.types.js';
|
|
11
|
+
export interface GhostConfigResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
config?: GhostConfig;
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TrustResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get a user's ghost configuration.
|
|
22
|
+
*/
|
|
23
|
+
export declare function handleGetConfig(userId: string, logger?: Logger): Promise<GhostConfigResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Update a user's ghost configuration.
|
|
26
|
+
* Validates all fields before persisting.
|
|
27
|
+
*/
|
|
28
|
+
export declare function handleUpdateConfig(userId: string, updates: Partial<GhostConfig>, logger?: Logger): Promise<GhostConfigResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Set trust level for a specific user.
|
|
31
|
+
* Validates trust range [0, 1] before persisting.
|
|
32
|
+
*/
|
|
33
|
+
export declare function handleSetTrust(ownerId: string, accessorId: string, level: number, logger?: Logger): Promise<TrustResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Remove trust level override for a specific user (reverts to default).
|
|
36
|
+
*/
|
|
37
|
+
export declare function handleRemoveTrust(ownerId: string, accessorId: string, logger?: Logger): Promise<TrustResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Block a user from ghost access.
|
|
40
|
+
*/
|
|
41
|
+
export declare function handleBlockUser(ownerId: string, targetId: string, logger?: Logger): Promise<TrustResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Unblock a user from ghost access.
|
|
44
|
+
*/
|
|
45
|
+
export declare function handleUnblockUser(ownerId: string, targetId: string, logger?: Logger): Promise<TrustResult>;
|
|
46
|
+
//# sourceMappingURL=ghost-config-handler.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-config-handler.service.d.ts","sourceRoot":"","sources":["../../src/services/ghost-config-handler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAalE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAOtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAOtB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ghost Config Handler — orchestration layer for ghost config operations.
|
|
3
|
+
*
|
|
4
|
+
* Thin business logic layer that validates inputs and delegates to
|
|
5
|
+
* GhostConfigService functions. Separates orchestration from storage.
|
|
6
|
+
*
|
|
7
|
+
* Ported from remember-mcp/src/tools/ghost-config.ts (business logic only).
|
|
8
|
+
*/
|
|
9
|
+
import { getGhostConfig, setGhostConfigFields, setUserTrust, removeUserTrust, blockUser, unblockUser, validateGhostConfigUpdate, } from './ghost-config.service.js';
|
|
10
|
+
const SERVICE = 'GhostConfigHandler';
|
|
11
|
+
/**
|
|
12
|
+
* Get a user's ghost configuration.
|
|
13
|
+
*/
|
|
14
|
+
export async function handleGetConfig(userId, logger) {
|
|
15
|
+
const config = await getGhostConfig(userId, logger);
|
|
16
|
+
logger?.debug('Ghost config retrieved', { service: SERVICE, userId });
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
config,
|
|
20
|
+
message: config.enabled
|
|
21
|
+
? 'Ghost mode is enabled.'
|
|
22
|
+
: 'Ghost mode is disabled.',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Update a user's ghost configuration.
|
|
27
|
+
* Validates all fields before persisting.
|
|
28
|
+
*/
|
|
29
|
+
export async function handleUpdateConfig(userId, updates, logger) {
|
|
30
|
+
// Validate before persisting
|
|
31
|
+
validateGhostConfigUpdate(updates);
|
|
32
|
+
const config = await setGhostConfigFields(userId, updates, logger);
|
|
33
|
+
logger?.info('Ghost config updated via handler', {
|
|
34
|
+
service: SERVICE,
|
|
35
|
+
userId,
|
|
36
|
+
updatedKeys: Object.keys(updates),
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
success: true,
|
|
40
|
+
config,
|
|
41
|
+
message: `Ghost config updated: ${Object.keys(updates).join(', ')}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Set trust level for a specific user.
|
|
46
|
+
* Validates trust range [0, 1] before persisting.
|
|
47
|
+
*/
|
|
48
|
+
export async function handleSetTrust(ownerId, accessorId, level, logger) {
|
|
49
|
+
if (ownerId === accessorId) {
|
|
50
|
+
return { success: false, message: 'Cannot set trust level for yourself.' };
|
|
51
|
+
}
|
|
52
|
+
if (level < 0 || level > 1) {
|
|
53
|
+
return { success: false, message: `Trust level must be between 0 and 1, got ${level}.` };
|
|
54
|
+
}
|
|
55
|
+
await setUserTrust(ownerId, accessorId, level, logger);
|
|
56
|
+
logger?.info('Trust level set via handler', {
|
|
57
|
+
service: SERVICE,
|
|
58
|
+
ownerId,
|
|
59
|
+
accessorId,
|
|
60
|
+
level,
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
message: `Trust level for user ${accessorId} set to ${level}.`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Remove trust level override for a specific user (reverts to default).
|
|
69
|
+
*/
|
|
70
|
+
export async function handleRemoveTrust(ownerId, accessorId, logger) {
|
|
71
|
+
await removeUserTrust(ownerId, accessorId, logger);
|
|
72
|
+
return {
|
|
73
|
+
success: true,
|
|
74
|
+
message: `Trust override for user ${accessorId} removed.`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Block a user from ghost access.
|
|
79
|
+
*/
|
|
80
|
+
export async function handleBlockUser(ownerId, targetId, logger) {
|
|
81
|
+
if (ownerId === targetId) {
|
|
82
|
+
return { success: false, message: 'Cannot block yourself.' };
|
|
83
|
+
}
|
|
84
|
+
await blockUser(ownerId, targetId, logger);
|
|
85
|
+
return {
|
|
86
|
+
success: true,
|
|
87
|
+
message: `User ${targetId} blocked from ghost access.`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Unblock a user from ghost access.
|
|
92
|
+
*/
|
|
93
|
+
export async function handleUnblockUser(ownerId, targetId, logger) {
|
|
94
|
+
await unblockUser(ownerId, targetId, logger);
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
message: `User ${targetId} unblocked from ghost access.`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ghost-config-handler.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-config-handler.service.js","sourceRoot":"","sources":["../../src/services/ghost-config-handler.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GhostConfig Firestore Service
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for ghost/persona configuration stored in Firestore.
|
|
5
|
+
* Implements GhostConfigProvider interface from access-control.service.ts.
|
|
6
|
+
*
|
|
7
|
+
* Firestore path: {BASE}.users/{ownerUserId}/ghost_config/settings
|
|
8
|
+
*
|
|
9
|
+
* Ported from remember-mcp/src/services/ghost-config.service.ts
|
|
10
|
+
*/
|
|
11
|
+
import type { Logger } from '../utils/logger.js';
|
|
12
|
+
import type { GhostConfig } from '../types/ghost-config.types.js';
|
|
13
|
+
import type { GhostConfigProvider } from './access-control.service.js';
|
|
14
|
+
/**
|
|
15
|
+
* Get a user's ghost configuration.
|
|
16
|
+
* Returns defaults merged with stored config.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getGhostConfig(ownerUserId: string, logger?: Logger): Promise<GhostConfig>;
|
|
19
|
+
/**
|
|
20
|
+
* Set (upsert) a user's ghost configuration.
|
|
21
|
+
* Merges partial config with existing values.
|
|
22
|
+
*/
|
|
23
|
+
export declare function setGhostConfigFields(ownerUserId: string, config: Partial<GhostConfig>, logger?: Logger): Promise<GhostConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* Set a per-user trust level override.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setUserTrust(ownerUserId: string, targetUserId: string, trustLevel: number, logger?: Logger): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Remove a per-user trust override (reverts to default).
|
|
30
|
+
*/
|
|
31
|
+
export declare function removeUserTrust(ownerUserId: string, targetUserId: string, logger?: Logger): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Block a user from ghost access.
|
|
34
|
+
*/
|
|
35
|
+
export declare function blockUser(ownerUserId: string, targetUserId: string, logger?: Logger): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Unblock a user from ghost access.
|
|
38
|
+
*/
|
|
39
|
+
export declare function unblockUser(ownerUserId: string, targetUserId: string, logger?: Logger): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a user's ghost is enabled.
|
|
42
|
+
*/
|
|
43
|
+
export declare function isGhostEnabled(ownerUserId: string, logger?: Logger): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Validate a partial GhostConfig update.
|
|
46
|
+
* Throws if any field values are invalid.
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateGhostConfigUpdate(config: Partial<GhostConfig>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Firestore-backed GhostConfigProvider implementation.
|
|
51
|
+
* Returns null if ghost is not enabled (same contract as StubGhostConfigProvider).
|
|
52
|
+
*/
|
|
53
|
+
export declare class FirestoreGhostConfigProvider implements GhostConfigProvider {
|
|
54
|
+
private logger?;
|
|
55
|
+
constructor(logger?: Logger | undefined);
|
|
56
|
+
getGhostConfig(ownerUserId: string): Promise<GhostConfig | null>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ghost-config.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-config.service.d.ts","sourceRoot":"","sources":["../../src/services/ghost-config.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,gCAAgC,CAAC;AAExF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAcvE;;;GAGG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkB/F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG3F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAwB5E;AAED;;;GAGG;AACH,qBAAa,4BAA6B,YAAW,mBAAmB;IAC1D,OAAO,CAAC,MAAM,CAAC;gBAAP,MAAM,CAAC,EAAE,MAAM,YAAA;IAE7B,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;CAOvE"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GhostConfig Firestore Service
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for ghost/persona configuration stored in Firestore.
|
|
5
|
+
* Implements GhostConfigProvider interface from access-control.service.ts.
|
|
6
|
+
*
|
|
7
|
+
* Firestore path: {BASE}.users/{ownerUserId}/ghost_config/settings
|
|
8
|
+
*
|
|
9
|
+
* Ported from remember-mcp/src/services/ghost-config.service.ts
|
|
10
|
+
*/
|
|
11
|
+
import { getDocument, setDocument } from '../database/firestore/init.js';
|
|
12
|
+
import { BASE } from '../database/firestore/paths.js';
|
|
13
|
+
import { DEFAULT_GHOST_CONFIG } from '../types/ghost-config.types.js';
|
|
14
|
+
const SERVICE = 'GhostConfigService';
|
|
15
|
+
/**
|
|
16
|
+
* Get the Firestore collection path for a user's ghost config.
|
|
17
|
+
*/
|
|
18
|
+
function getGhostConfigPath(ownerUserId) {
|
|
19
|
+
return {
|
|
20
|
+
collectionPath: `${BASE}.users/${ownerUserId}/ghost_config`,
|
|
21
|
+
docId: 'settings',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get a user's ghost configuration.
|
|
26
|
+
* Returns defaults merged with stored config.
|
|
27
|
+
*/
|
|
28
|
+
export async function getGhostConfig(ownerUserId, logger) {
|
|
29
|
+
try {
|
|
30
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
31
|
+
const doc = await getDocument(collectionPath, docId);
|
|
32
|
+
if (!doc) {
|
|
33
|
+
return { ...DEFAULT_GHOST_CONFIG };
|
|
34
|
+
}
|
|
35
|
+
return { ...DEFAULT_GHOST_CONFIG, ...doc };
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger?.error('Failed to get ghost config', {
|
|
39
|
+
service: SERVICE,
|
|
40
|
+
ownerUserId,
|
|
41
|
+
error: error instanceof Error ? error.message : String(error),
|
|
42
|
+
});
|
|
43
|
+
return { ...DEFAULT_GHOST_CONFIG };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set (upsert) a user's ghost configuration.
|
|
48
|
+
* Merges partial config with existing values.
|
|
49
|
+
*/
|
|
50
|
+
export async function setGhostConfigFields(ownerUserId, config, logger) {
|
|
51
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
52
|
+
await setDocument(collectionPath, docId, config, { merge: true });
|
|
53
|
+
logger?.info('Ghost config updated', {
|
|
54
|
+
service: SERVICE,
|
|
55
|
+
ownerUserId,
|
|
56
|
+
updatedKeys: Object.keys(config),
|
|
57
|
+
});
|
|
58
|
+
return getGhostConfig(ownerUserId, logger);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Set a per-user trust level override.
|
|
62
|
+
*/
|
|
63
|
+
export async function setUserTrust(ownerUserId, targetUserId, trustLevel, logger) {
|
|
64
|
+
if (trustLevel < 0 || trustLevel > 1) {
|
|
65
|
+
throw new Error(`Trust level must be between 0 and 1, got ${trustLevel}`);
|
|
66
|
+
}
|
|
67
|
+
const current = await getGhostConfig(ownerUserId, logger);
|
|
68
|
+
const per_user_trust = { ...current.per_user_trust, [targetUserId]: trustLevel };
|
|
69
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
70
|
+
await setDocument(collectionPath, docId, { per_user_trust }, { merge: true });
|
|
71
|
+
logger?.info('User trust level set', {
|
|
72
|
+
service: SERVICE,
|
|
73
|
+
ownerUserId,
|
|
74
|
+
targetUserId,
|
|
75
|
+
trustLevel,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove a per-user trust override (reverts to default).
|
|
80
|
+
*/
|
|
81
|
+
export async function removeUserTrust(ownerUserId, targetUserId, logger) {
|
|
82
|
+
const current = await getGhostConfig(ownerUserId, logger);
|
|
83
|
+
const per_user_trust = { ...current.per_user_trust };
|
|
84
|
+
delete per_user_trust[targetUserId];
|
|
85
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
86
|
+
await setDocument(collectionPath, docId, { per_user_trust }, { merge: true });
|
|
87
|
+
logger?.info('User trust override removed', {
|
|
88
|
+
service: SERVICE,
|
|
89
|
+
ownerUserId,
|
|
90
|
+
targetUserId,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Block a user from ghost access.
|
|
95
|
+
*/
|
|
96
|
+
export async function blockUser(ownerUserId, targetUserId, logger) {
|
|
97
|
+
const current = await getGhostConfig(ownerUserId, logger);
|
|
98
|
+
if (current.blocked_users.includes(targetUserId)) {
|
|
99
|
+
return; // already blocked
|
|
100
|
+
}
|
|
101
|
+
const blocked_users = [...current.blocked_users, targetUserId];
|
|
102
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
103
|
+
await setDocument(collectionPath, docId, { blocked_users }, { merge: true });
|
|
104
|
+
logger?.info('User blocked from ghost access', {
|
|
105
|
+
service: SERVICE,
|
|
106
|
+
ownerUserId,
|
|
107
|
+
targetUserId,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Unblock a user from ghost access.
|
|
112
|
+
*/
|
|
113
|
+
export async function unblockUser(ownerUserId, targetUserId, logger) {
|
|
114
|
+
const current = await getGhostConfig(ownerUserId, logger);
|
|
115
|
+
if (!current.blocked_users.includes(targetUserId)) {
|
|
116
|
+
return; // not blocked
|
|
117
|
+
}
|
|
118
|
+
const blocked_users = current.blocked_users.filter(id => id !== targetUserId);
|
|
119
|
+
const { collectionPath, docId } = getGhostConfigPath(ownerUserId);
|
|
120
|
+
await setDocument(collectionPath, docId, { blocked_users }, { merge: true });
|
|
121
|
+
logger?.info('User unblocked from ghost access', {
|
|
122
|
+
service: SERVICE,
|
|
123
|
+
ownerUserId,
|
|
124
|
+
targetUserId,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a user's ghost is enabled.
|
|
129
|
+
*/
|
|
130
|
+
export async function isGhostEnabled(ownerUserId, logger) {
|
|
131
|
+
const config = await getGhostConfig(ownerUserId, logger);
|
|
132
|
+
return config.enabled;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Validate a partial GhostConfig update.
|
|
136
|
+
* Throws if any field values are invalid.
|
|
137
|
+
*/
|
|
138
|
+
export function validateGhostConfigUpdate(config) {
|
|
139
|
+
if (config.default_friend_trust !== undefined) {
|
|
140
|
+
if (config.default_friend_trust < 0 || config.default_friend_trust > 1) {
|
|
141
|
+
throw new Error(`default_friend_trust must be between 0 and 1, got ${config.default_friend_trust}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (config.default_public_trust !== undefined) {
|
|
145
|
+
if (config.default_public_trust < 0 || config.default_public_trust > 1) {
|
|
146
|
+
throw new Error(`default_public_trust must be between 0 and 1, got ${config.default_public_trust}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (config.enforcement_mode !== undefined) {
|
|
150
|
+
const valid = ['query', 'prompt', 'hybrid'];
|
|
151
|
+
if (!valid.includes(config.enforcement_mode)) {
|
|
152
|
+
throw new Error(`enforcement_mode must be one of ${valid.join(', ')}, got ${config.enforcement_mode}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (config.per_user_trust !== undefined) {
|
|
156
|
+
for (const [userId, level] of Object.entries(config.per_user_trust)) {
|
|
157
|
+
if (level < 0 || level > 1) {
|
|
158
|
+
throw new Error(`Trust level for ${userId} must be between 0 and 1, got ${level}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Firestore-backed GhostConfigProvider implementation.
|
|
165
|
+
* Returns null if ghost is not enabled (same contract as StubGhostConfigProvider).
|
|
166
|
+
*/
|
|
167
|
+
export class FirestoreGhostConfigProvider {
|
|
168
|
+
logger;
|
|
169
|
+
constructor(logger) {
|
|
170
|
+
this.logger = logger;
|
|
171
|
+
}
|
|
172
|
+
async getGhostConfig(ownerUserId) {
|
|
173
|
+
const config = await getGhostConfig(ownerUserId, this.logger);
|
|
174
|
+
if (!config.enabled) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
return config;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=ghost-config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost-config.service.js","sourceRoot":"","sources":["../../src/services/ghost-config.service.ts"],"names":[],"mappings":"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"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -8,4 +8,10 @@ export { getSpaceConfig, setSpaceConfig, DEFAULT_SPACE_CONFIG, type SpaceConfig,
|
|
|
8
8
|
export { MemoryService, type CreateMemoryInput, type CreateMemoryResult, type SearchMemoryInput, type SearchMemoryResult, type FindSimilarInput, type FindSimilarResult, type SimilarMemoryItem, type QueryMemoryInput, type QueryMemoryResult, type RelevantMemoryItem, type UpdateMemoryInput, type UpdateMemoryResult, type DeleteMemoryInput, type DeleteMemoryResult, } from './memory.service.js';
|
|
9
9
|
export { RelationshipService, type CreateRelationshipInput, type CreateRelationshipResult, type UpdateRelationshipInput, type UpdateRelationshipResult, type SearchRelationshipInput, type SearchRelationshipResult, type DeleteRelationshipInput, type DeleteRelationshipResult, } from './relationship.service.js';
|
|
10
10
|
export { SpaceService, type PublishInput, type PublishResult, type RetractInput, type RetractResult, type ReviseInput, type ReviseResult, type ConfirmInput, type ConfirmResult, type DenyInput, type DenyResult, type ModerateInput, type ModerateResult, type SearchSpaceInput, type SearchSpaceResult, type QuerySpaceInput, type QuerySpaceResult, type ModerationAction, type ModerationFilter, type RevisionEntry, type RevisionResult, buildModerationFilter, parseRevisionHistory, buildRevisionHistory, } from './space.service.js';
|
|
11
|
+
export { TRUST_THRESHOLDS, buildTrustFilter, formatMemoryForPrompt, getTrustLevelLabel, getTrustInstructions, redactSensitiveFields, isTrustSufficient, resolveEnforcementMode, type FormattedMemory, } from './trust-enforcement.service.js';
|
|
12
|
+
export { validateTrustAssignment, suggestTrustLevel, type TrustValidationResult, } from './trust-validator.service.js';
|
|
13
|
+
export { checkMemoryAccess, handleInsufficientTrust, isMemoryBlocked, resetBlock, resolveAccessorTrustLevel, formatAccessResultMessage, canRevise, canOverwrite, TRUST_PENALTY, MAX_ATTEMPTS_BEFORE_BLOCK, type MemoryBlock, type AttemptRecord, type GhostConfigProvider, type EscalationStore, type PublishedMemoryACL, StubGhostConfigProvider, InMemoryEscalationStore, } from './access-control.service.js';
|
|
14
|
+
export { getGhostConfig, setGhostConfigFields, setUserTrust, removeUserTrust, blockUser, unblockUser, isGhostEnabled, validateGhostConfigUpdate, FirestoreGhostConfigProvider, } from './ghost-config.service.js';
|
|
15
|
+
export { FirestoreEscalationStore, } from './escalation.service.js';
|
|
16
|
+
export { handleGetConfig, handleUpdateConfig, handleSetTrust, handleRemoveTrust, handleBlockUser, handleUnblockUser, type GhostConfigResult, type TrustResult, } from './ghost-config-handler.service.js';
|
|
11
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EACL,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EACL,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,UAAU,EACV,yBAAyB,EACzB,yBAAyB,EACzB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,yBAAyB,EACzB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,GACjB,MAAM,mCAAmC,CAAC"}
|
package/dist/services/index.js
CHANGED
|
@@ -14,4 +14,11 @@ export { getSpaceConfig, setSpaceConfig, DEFAULT_SPACE_CONFIG, } from './space-c
|
|
|
14
14
|
export { MemoryService, } from './memory.service.js';
|
|
15
15
|
export { RelationshipService, } from './relationship.service.js';
|
|
16
16
|
export { SpaceService, buildModerationFilter, parseRevisionHistory, buildRevisionHistory, } from './space.service.js';
|
|
17
|
+
// Trust & ghost system services (ported from remember-mcp v3.11.0+)
|
|
18
|
+
export { TRUST_THRESHOLDS, buildTrustFilter, formatMemoryForPrompt, getTrustLevelLabel, getTrustInstructions, redactSensitiveFields, isTrustSufficient, resolveEnforcementMode, } from './trust-enforcement.service.js';
|
|
19
|
+
export { validateTrustAssignment, suggestTrustLevel, } from './trust-validator.service.js';
|
|
20
|
+
export { checkMemoryAccess, handleInsufficientTrust, isMemoryBlocked, resetBlock, resolveAccessorTrustLevel, formatAccessResultMessage, canRevise, canOverwrite, TRUST_PENALTY, MAX_ATTEMPTS_BEFORE_BLOCK, StubGhostConfigProvider, InMemoryEscalationStore, } from './access-control.service.js';
|
|
21
|
+
export { getGhostConfig, setGhostConfigFields, setUserTrust, removeUserTrust, blockUser, unblockUser, isGhostEnabled, validateGhostConfigUpdate, FirestoreGhostConfigProvider, } from './ghost-config.service.js';
|
|
22
|
+
export { FirestoreEscalationStore, } from './escalation.service.js';
|
|
23
|
+
export { handleGetConfig, handleUpdateConfig, handleSetTrust, handleRemoveTrust, handleBlockUser, handleUnblockUser, } from './ghost-config-handler.service.js';
|
|
17
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wCAAwC;AACxC,mDAAmD;AACnD,mDAAmD;AACnD,2DAA2D;AAC3D,mDAAmD;AAEnD,kBAAkB;AAClB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EACL,wBAAwB,GAEzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,GAed,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,GASpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,YAAY,EAqBZ,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wCAAwC;AACxC,mDAAmD;AACnD,mDAAmD;AACnD,2DAA2D;AAC3D,mDAAmD;AAEnD,kBAAkB;AAClB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EACL,wBAAwB,GAEzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,aAAa,GAed,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,GASpB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,YAAY,EAqBZ,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,oEAAoE;AACpE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAElB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,UAAU,EACV,yBAAyB,EACzB,yBAAyB,EACzB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,yBAAyB,EAMzB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,EACX,cAAc,EACd,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAGlB,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust enforcement service — 3 configurable modes for cross-user memory access.
|
|
3
|
+
*
|
|
4
|
+
* - query mode (default): memories above trust threshold never returned from Weaviate
|
|
5
|
+
* - prompt mode: all memories returned, formatted/redacted by trust level
|
|
6
|
+
* - hybrid mode: query filter for trust 0.0, prompt filter for rest
|
|
7
|
+
*
|
|
8
|
+
* Ported from remember-mcp/src/services/trust-enforcement.ts
|
|
9
|
+
*/
|
|
10
|
+
import type { Memory } from '../types/memory.types.js';
|
|
11
|
+
import type { TrustEnforcementMode } from '../types/ghost-config.types.js';
|
|
12
|
+
/** Trust level thresholds mapping continuous 0-1 values to discrete behavior tiers */
|
|
13
|
+
export declare const TRUST_THRESHOLDS: {
|
|
14
|
+
readonly FULL_ACCESS: 1;
|
|
15
|
+
readonly PARTIAL_ACCESS: 0.75;
|
|
16
|
+
readonly SUMMARY_ONLY: 0.5;
|
|
17
|
+
readonly METADATA_ONLY: 0.25;
|
|
18
|
+
readonly EXISTENCE_ONLY: 0;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Build a Weaviate filter that restricts memories by trust score.
|
|
22
|
+
* Only returns memories where trust_score <= accessorTrustLevel.
|
|
23
|
+
*
|
|
24
|
+
* @param collection - Weaviate collection instance
|
|
25
|
+
* @param accessorTrustLevel - The accessor's trust level (0-1)
|
|
26
|
+
* @returns Weaviate filter object
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildTrustFilter(collection: any, accessorTrustLevel: number): any;
|
|
29
|
+
/**
|
|
30
|
+
* Formatted memory representation for prompt-level enforcement.
|
|
31
|
+
* Content is redacted/formatted based on trust level.
|
|
32
|
+
*/
|
|
33
|
+
export interface FormattedMemory {
|
|
34
|
+
memory_id: string;
|
|
35
|
+
trust_tier: string;
|
|
36
|
+
content: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format a memory for inclusion in an LLM prompt, redacted by trust level.
|
|
40
|
+
*
|
|
41
|
+
* Trust tiers:
|
|
42
|
+
* - 1.0 Full Access: full content, all details
|
|
43
|
+
* - 0.75 Partial Access: content with sensitive fields redacted
|
|
44
|
+
* - 0.5 Summary Only: title + summary, no content
|
|
45
|
+
* - 0.25 Metadata Only: type, date, tags — no content or summary
|
|
46
|
+
* - 0.0 Existence Only: "A memory exists about this topic"
|
|
47
|
+
*
|
|
48
|
+
* Trust 1.0 memories are always existence-only for cross-users, regardless of
|
|
49
|
+
* accessor trust level. Use `isSelfAccess = true` to bypass for owner access.
|
|
50
|
+
*
|
|
51
|
+
* @param memory - The memory to format
|
|
52
|
+
* @param accessorTrustLevel - The accessor's trust level (0-1)
|
|
53
|
+
* @param isSelfAccess - True if the accessor is the memory owner (bypasses trust 1.0 cap)
|
|
54
|
+
* @returns Formatted memory for prompt inclusion
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatMemoryForPrompt(memory: Memory, accessorTrustLevel: number, isSelfAccess?: boolean): FormattedMemory;
|
|
57
|
+
/**
|
|
58
|
+
* Get a human-readable label for a trust level.
|
|
59
|
+
*/
|
|
60
|
+
export declare function getTrustLevelLabel(trust: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* Get LLM instruction text describing what to reveal at a given trust level.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getTrustInstructions(trust: number): string;
|
|
65
|
+
/**
|
|
66
|
+
* Redact sensitive fields from a memory for partial access.
|
|
67
|
+
* Returns a copy with location, context, and references cleared.
|
|
68
|
+
*/
|
|
69
|
+
export declare function redactSensitiveFields(memory: Memory, _trust: number): Memory;
|
|
70
|
+
/**
|
|
71
|
+
* Check whether an accessor's trust level is sufficient for a memory.
|
|
72
|
+
* Access is granted when accessorTrust >= memoryTrust.
|
|
73
|
+
*/
|
|
74
|
+
export declare function isTrustSufficient(memoryTrust: number, accessorTrust: number): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Determine the enforcement mode to use.
|
|
77
|
+
* Convenience function that returns the mode from GhostConfig or falls back to 'query'.
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveEnforcementMode(mode?: TrustEnforcementMode): TrustEnforcementMode;
|
|
80
|
+
//# sourceMappingURL=trust-enforcement.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-enforcement.service.d.ts","sourceRoot":"","sources":["../../src/services/trust-enforcement.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAI3E,sFAAsF;AACtF,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC;AAIX;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,GAAG,GAAG,CAEjF;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,eAAe,CAwDvH;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAc1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAe5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAExF"}
|