@prmichaelsen/remember-core 0.12.0 → 0.15.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 +33 -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/memory.service.d.ts +4 -1
- package/dist/services/memory.service.d.ts.map +1 -1
- package/dist/services/memory.service.js +32 -6
- package/dist/services/memory.service.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/testing/weaviate-mock.d.ts +15 -0
- package/dist/testing/weaviate-mock.d.ts.map +1 -1
- package/dist/testing/weaviate-mock.js +3 -0
- package/dist/testing/weaviate-mock.js.map +1 -1
- 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 +5 -2
- 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/types/search.types.d.ts +12 -0
- package/dist/types/search.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/dist/web/context.d.ts +60 -0
- package/dist/web/context.d.ts.map +1 -0
- package/dist/web/context.js +22 -0
- package/dist/web/context.js.map +1 -0
- package/dist/web/errors.d.ts +23 -0
- package/dist/web/errors.d.ts.map +1 -0
- package/dist/web/errors.js +28 -0
- package/dist/web/errors.js.map +1 -0
- package/dist/web/ghost.d.ts +64 -0
- package/dist/web/ghost.d.ts.map +1 -0
- package/dist/web/ghost.js +152 -0
- package/dist/web/ghost.js.map +1 -0
- package/dist/web/guard.d.ts +6 -0
- package/dist/web/guard.d.ts.map +1 -0
- package/dist/web/guard.js +14 -0
- package/dist/web/guard.js.map +1 -0
- package/dist/web/index.d.ts +16 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +23 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/memories.d.ts +30 -0
- package/dist/web/memories.d.ts.map +1 -0
- package/dist/web/memories.js +92 -0
- package/dist/web/memories.js.map +1 -0
- package/dist/web/preferences.d.ts +6 -0
- package/dist/web/preferences.d.ts.map +1 -0
- package/dist/web/preferences.js +33 -0
- package/dist/web/preferences.js.map +1 -0
- package/dist/web/profiles.d.ts +36 -0
- package/dist/web/profiles.d.ts.map +1 -0
- package/dist/web/profiles.js +152 -0
- package/dist/web/profiles.js.map +1 -0
- package/dist/web/relationships.d.ts +22 -0
- package/dist/web/relationships.d.ts.map +1 -0
- package/dist/web/relationships.js +77 -0
- package/dist/web/relationships.js.map +1 -0
- package/dist/web/result.d.ts +37 -0
- package/dist/web/result.d.ts.map +1 -0
- package/dist/web/result.js +46 -0
- package/dist/web/result.js.map +1 -0
- package/dist/web/spaces.d.ts +44 -0
- package/dist/web/spaces.d.ts.map +1 -0
- package/dist/web/spaces.js +118 -0
- package/dist/web/spaces.js.map +1 -0
- package/dist/web/testing-helpers.d.ts +13 -0
- package/dist/web/testing-helpers.d.ts.map +1 -0
- package/dist/web/testing-helpers.js +41 -0
- package/dist/web/testing-helpers.js.map +1 -0
- package/dist/web/types.d.ts +68 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +9 -0
- package/dist/web/types.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// src/web/ghost.ts
|
|
2
|
+
// Ghost config, trust management, access checking, and searchAsGhost compound operation
|
|
3
|
+
import { DEFAULT_GHOST_CONFIG } from '../types/ghost-config.types.js';
|
|
4
|
+
import { ok, err } from './result.js';
|
|
5
|
+
import { internal } from './errors.js';
|
|
6
|
+
import { handleGetConfig, handleUpdateConfig, handleSetTrust, handleRemoveTrust, handleBlockUser, handleUnblockUser, } from '../services/ghost-config-handler.service.js';
|
|
7
|
+
import { resolveAccessorTrustLevel } from '../services/access-control.service.js';
|
|
8
|
+
import { formatMemoryForPrompt, getTrustLevelLabel } from '../services/trust-enforcement.service.js';
|
|
9
|
+
import { paginated } from './types.js';
|
|
10
|
+
// ─── Ghost Config Management ──────────────────────────────────────────
|
|
11
|
+
export async function getGhostConfig(ctx) {
|
|
12
|
+
try {
|
|
13
|
+
const result = await handleGetConfig(ctx.userId, ctx.logger);
|
|
14
|
+
return ok({
|
|
15
|
+
success: result.success,
|
|
16
|
+
config: result.config ?? DEFAULT_GHOST_CONFIG,
|
|
17
|
+
message: result.message,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
return err(wrapError(e));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function updateGhostConfig(ctx, input) {
|
|
25
|
+
try {
|
|
26
|
+
const result = await handleUpdateConfig(ctx.userId, input, ctx.logger);
|
|
27
|
+
return ok({
|
|
28
|
+
success: result.success,
|
|
29
|
+
config: result.config ?? DEFAULT_GHOST_CONFIG,
|
|
30
|
+
message: result.message,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return err(wrapError(e));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ─── Trust Management ─────────────────────────────────────────────────
|
|
38
|
+
export async function setUserTrust(ctx, input) {
|
|
39
|
+
try {
|
|
40
|
+
const result = await handleSetTrust(ctx.userId, input.target_user_id, input.trust_level, ctx.logger);
|
|
41
|
+
if (!result.success) {
|
|
42
|
+
return err(internal(result.message));
|
|
43
|
+
}
|
|
44
|
+
return ok(result);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return err(wrapError(e));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function removeUserTrust(ctx, input) {
|
|
51
|
+
try {
|
|
52
|
+
const result = await handleRemoveTrust(ctx.userId, input.target_user_id, ctx.logger);
|
|
53
|
+
return ok(result);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
return err(wrapError(e));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function blockUser(ctx, input) {
|
|
60
|
+
try {
|
|
61
|
+
const result = await handleBlockUser(ctx.userId, input.target_user_id, ctx.logger);
|
|
62
|
+
if (!result.success) {
|
|
63
|
+
return err(internal(result.message));
|
|
64
|
+
}
|
|
65
|
+
return ok(result);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return err(wrapError(e));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function unblockUser(ctx, input) {
|
|
72
|
+
try {
|
|
73
|
+
const result = await handleUnblockUser(ctx.userId, input.target_user_id, ctx.logger);
|
|
74
|
+
return ok(result);
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
return err(wrapError(e));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ─── Access Checking ──────────────────────────────────────────────────
|
|
81
|
+
export async function checkAccess(ctx, input) {
|
|
82
|
+
try {
|
|
83
|
+
// Resolve ghost config for the memory owner (ctx.userId owns the memories)
|
|
84
|
+
const ghostConfig = await ctx.ghostConfigProvider.getGhostConfig(ctx.userId);
|
|
85
|
+
if (!ghostConfig || !ghostConfig.enabled) {
|
|
86
|
+
return ok({ accessible: true, trust_tier: 'full_access', reason: 'Ghost mode disabled' });
|
|
87
|
+
}
|
|
88
|
+
const trustLevel = resolveAccessorTrustLevel(ghostConfig, input.accessor_user_id);
|
|
89
|
+
const tier = getTrustLevelLabel(trustLevel);
|
|
90
|
+
// Check if user is blocked
|
|
91
|
+
const block = await ctx.escalationStore.getBlock(ctx.userId, input.accessor_user_id, input.memory_id);
|
|
92
|
+
if (block) {
|
|
93
|
+
return ok({ accessible: false, trust_tier: 'blocked', reason: 'User is blocked from accessing this memory' });
|
|
94
|
+
}
|
|
95
|
+
return ok({
|
|
96
|
+
accessible: true,
|
|
97
|
+
trust_tier: tier.toLowerCase().replace(/ /g, '_'),
|
|
98
|
+
reason: undefined,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
return err(wrapError(e));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ─── Compound: searchAsGhost ──────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Search memories as a ghost user — resolves trust context automatically.
|
|
108
|
+
* Combines: resolve trust level → build ghost_context → search → redact content.
|
|
109
|
+
*/
|
|
110
|
+
export async function searchAsGhost(ctx, input) {
|
|
111
|
+
try {
|
|
112
|
+
// 1. Resolve ghost config for the memory owner
|
|
113
|
+
const ghostConfig = await ctx.ghostConfigProvider.getGhostConfig(input.owner_user_id);
|
|
114
|
+
const config = ghostConfig ?? DEFAULT_GHOST_CONFIG;
|
|
115
|
+
// 2. Resolve accessor trust level
|
|
116
|
+
const accessorTrustLevel = resolveAccessorTrustLevel(config, ctx.userId);
|
|
117
|
+
// 3. Search with ghost_context
|
|
118
|
+
const limit = input.limit ?? 10;
|
|
119
|
+
const offset = input.offset ?? 0;
|
|
120
|
+
const searchResult = await ctx.memoryService.search({
|
|
121
|
+
query: input.query,
|
|
122
|
+
limit,
|
|
123
|
+
offset,
|
|
124
|
+
ghost_context: {
|
|
125
|
+
accessor_trust_level: accessorTrustLevel,
|
|
126
|
+
owner_user_id: input.owner_user_id,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// 4. Redact content based on trust tier
|
|
130
|
+
const redacted = searchResult.memories.map((raw) => {
|
|
131
|
+
const formatted = formatMemoryForPrompt(raw, accessorTrustLevel, false);
|
|
132
|
+
const tier = formatted.trust_tier.toLowerCase().replace(/ /g, '_');
|
|
133
|
+
return {
|
|
134
|
+
memory_id: formatted.memory_id,
|
|
135
|
+
trust_tier: tier,
|
|
136
|
+
content: formatted.content,
|
|
137
|
+
tags: (raw.tags ?? []),
|
|
138
|
+
access_level: formatted.trust_tier,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
return ok(paginated(redacted, searchResult.total, limit, offset));
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
return err(wrapError(e));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
148
|
+
function wrapError(e) {
|
|
149
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
150
|
+
return internal(message);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=ghost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghost.js","sourceRoot":"","sources":["../../src/web/ghost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/web/guard.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/web/guard.ts
|
|
2
|
+
// Browser guard — prevents accidental import in client-side code
|
|
3
|
+
/**
|
|
4
|
+
* Throws if running in a browser environment.
|
|
5
|
+
* Called at module load time from the web SDK barrel export.
|
|
6
|
+
*/
|
|
7
|
+
export function assertServerSide() {
|
|
8
|
+
if (typeof window !== 'undefined') {
|
|
9
|
+
throw new Error('@prmichaelsen/remember-core/web is server-side only. ' +
|
|
10
|
+
'Do not import this module in browser code — it requires ' +
|
|
11
|
+
'database credentials that must not be exposed to clients.');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/web/guard.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,iEAAiE;AAEjE;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,uDAAuD;YACvD,0DAA0D;YAC1D,2DAA2D,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type { Result } from './result.js';
|
|
2
|
+
export { ok, err, isOk, mapOk, tryCatch } from './result.js';
|
|
3
|
+
export type { WebSDKError, ErrorKind } from './errors.js';
|
|
4
|
+
export { createError, notFound, validation, unauthorized, forbidden, conflict, internal } from './errors.js';
|
|
5
|
+
export { assertServerSide } from './guard.js';
|
|
6
|
+
export type { WebSDKContext, CreateWebSDKContextOptions } from './context.js';
|
|
7
|
+
export { createWebSDKContext } from './context.js';
|
|
8
|
+
export type { PaginatedResult, MemorySearchResult, SimilarMemory, RelevantMemory, RelationshipSearchResult, SpaceSearchResult, ProfileSearchResult, RedactedMemory, } from './types.js';
|
|
9
|
+
export { paginated } from './types.js';
|
|
10
|
+
export { createMemory, searchMemories, findSimilarMemories, queryMemories, updateMemory, deleteMemory, } from './memories.js';
|
|
11
|
+
export { createRelationship, searchRelationships, updateRelationship, deleteRelationship, } from './relationships.js';
|
|
12
|
+
export { publishToSpace, retractFromSpace, reviseInSpace, moderateSpace, searchSpace, querySpace, } from './spaces.js';
|
|
13
|
+
export { getGhostConfig, updateGhostConfig, setUserTrust, removeUserTrust, blockUser, unblockUser, checkAccess, searchAsGhost, } from './ghost.js';
|
|
14
|
+
export { createAndPublishProfile, searchProfiles, retractProfile, updateAndRepublishProfile, } from './profiles.js';
|
|
15
|
+
export { getPreferences, updatePreferences, } from './preferences.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AASA,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7D,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAInD,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAC;AAIvB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAIrB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AAIvB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/web/index.ts
|
|
2
|
+
// @prmichaelsen/remember-core/web — barrel export
|
|
3
|
+
// Server-side only: assertServerSide() runs at import time.
|
|
4
|
+
import { assertServerSide } from './guard.js';
|
|
5
|
+
assertServerSide();
|
|
6
|
+
export { ok, err, isOk, mapOk, tryCatch } from './result.js';
|
|
7
|
+
export { createError, notFound, validation, unauthorized, forbidden, conflict, internal } from './errors.js';
|
|
8
|
+
export { assertServerSide } from './guard.js';
|
|
9
|
+
export { createWebSDKContext } from './context.js';
|
|
10
|
+
export { paginated } from './types.js';
|
|
11
|
+
// ─── Use Cases: Memories ──────────────────────────────────────────────
|
|
12
|
+
export { createMemory, searchMemories, findSimilarMemories, queryMemories, updateMemory, deleteMemory, } from './memories.js';
|
|
13
|
+
// ─── Use Cases: Relationships ─────────────────────────────────────────
|
|
14
|
+
export { createRelationship, searchRelationships, updateRelationship, deleteRelationship, } from './relationships.js';
|
|
15
|
+
// ─── Use Cases: Spaces ────────────────────────────────────────────────
|
|
16
|
+
export { publishToSpace, retractFromSpace, reviseInSpace, moderateSpace, searchSpace, querySpace, } from './spaces.js';
|
|
17
|
+
// ─── Use Cases: Ghost/Trust ───────────────────────────────────────────
|
|
18
|
+
export { getGhostConfig, updateGhostConfig, setUserTrust, removeUserTrust, blockUser, unblockUser, checkAccess, searchAsGhost, } from './ghost.js';
|
|
19
|
+
// ─── Use Cases: Profiles ──────────────────────────────────────────────
|
|
20
|
+
export { createAndPublishProfile, searchProfiles, retractProfile, updateAndRepublishProfile, } from './profiles.js';
|
|
21
|
+
// ─── Use Cases: Preferences ──────────────────────────────────────────
|
|
22
|
+
export { getPreferences, updatePreferences, } from './preferences.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,kDAAkD;AAClD,4DAA4D;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,gBAAgB,EAAE,CAAC;AAKnB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAcnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,yEAAyE;AAEzE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,yEAAyE;AAEzE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,yEAAyE;AAEzE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,yEAAyE;AAEzE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,yEAAyE;AAEzE,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AAEvB,wEAAwE;AAExE,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { WebSDKContext } from './context.js';
|
|
2
|
+
import type { Result } from './result.js';
|
|
3
|
+
import type { CreateMemoryInput, SearchMemoryInput, FindSimilarInput, QueryMemoryInput, UpdateMemoryInput, DeleteMemoryInput } from '../services/memory.service.js';
|
|
4
|
+
import type { PaginatedResult, MemorySearchResult, SimilarMemory, RelevantMemory } from './types.js';
|
|
5
|
+
export type { CreateMemoryInput, SearchMemoryInput, FindSimilarInput, QueryMemoryInput, UpdateMemoryInput, DeleteMemoryInput, };
|
|
6
|
+
export declare function createMemory(ctx: WebSDKContext, input: CreateMemoryInput): Promise<Result<{
|
|
7
|
+
memory_id: string;
|
|
8
|
+
created_at: string;
|
|
9
|
+
}>>;
|
|
10
|
+
export declare function searchMemories(ctx: WebSDKContext, input: Omit<SearchMemoryInput, 'ghost_context'>): Promise<Result<PaginatedResult<MemorySearchResult>>>;
|
|
11
|
+
export declare function findSimilarMemories(ctx: WebSDKContext, input: Omit<FindSimilarInput, 'ghost_context'>): Promise<Result<{
|
|
12
|
+
similar_memories: SimilarMemory[];
|
|
13
|
+
total: number;
|
|
14
|
+
}>>;
|
|
15
|
+
export declare function queryMemories(ctx: WebSDKContext, input: Omit<QueryMemoryInput, 'ghost_context'>): Promise<Result<{
|
|
16
|
+
memories: RelevantMemory[];
|
|
17
|
+
total: number;
|
|
18
|
+
}>>;
|
|
19
|
+
export declare function updateMemory(ctx: WebSDKContext, input: UpdateMemoryInput): Promise<Result<{
|
|
20
|
+
memory_id: string;
|
|
21
|
+
updated_at: string;
|
|
22
|
+
version: number;
|
|
23
|
+
updated_fields: string[];
|
|
24
|
+
}>>;
|
|
25
|
+
export declare function deleteMemory(ctx: WebSDKContext, input: DeleteMemoryInput): Promise<Result<{
|
|
26
|
+
memory_id: string;
|
|
27
|
+
deleted_at: string;
|
|
28
|
+
orphaned_relationship_ids: string[];
|
|
29
|
+
}>>;
|
|
30
|
+
//# sourceMappingURL=memories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/web/memories.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAIpB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,CAAC;AAIF,wBAAsB,YAAY,CAChC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAO5D;AAID,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAQtD;AAID,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,GAC7C,OAAO,CAAC,MAAM,CAAC;IAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAWvE;AAID,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,GAC7C,OAAO,CAAC,MAAM,CAAC;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAWhE;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAOvG;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,yBAAyB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAOjG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/web/memories.ts
|
|
2
|
+
// Memory CRUD + search use cases — wraps MemoryService with Result<T, E>
|
|
3
|
+
import { ok, err } from './result.js';
|
|
4
|
+
import { internal } from './errors.js';
|
|
5
|
+
import { paginated } from './types.js';
|
|
6
|
+
// ─── Create ───────────────────────────────────────────────────────────
|
|
7
|
+
export async function createMemory(ctx, input) {
|
|
8
|
+
try {
|
|
9
|
+
const result = await ctx.memoryService.create(input);
|
|
10
|
+
return ok(result);
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return err(wrapError(e));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// ─── Search (hybrid) ─────────────────────────────────────────────────
|
|
17
|
+
export async function searchMemories(ctx, input) {
|
|
18
|
+
try {
|
|
19
|
+
const result = await ctx.memoryService.search(input);
|
|
20
|
+
const items = result.memories.map(toMemorySearchResult);
|
|
21
|
+
return ok(paginated(items, result.total, result.limit, result.offset));
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
return err(wrapError(e));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ─── Find Similar (vector) ───────────────────────────────────────────
|
|
28
|
+
export async function findSimilarMemories(ctx, input) {
|
|
29
|
+
try {
|
|
30
|
+
const result = await ctx.memoryService.findSimilar(input);
|
|
31
|
+
const similar_memories = result.similar_memories.map((m) => ({
|
|
32
|
+
...toMemorySearchResult(m),
|
|
33
|
+
similarity: m.similarity,
|
|
34
|
+
}));
|
|
35
|
+
return ok({ similar_memories, total: result.total });
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
return err(wrapError(e));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ─── Query (semantic / nearText) ──────────────────────────────────────
|
|
42
|
+
export async function queryMemories(ctx, input) {
|
|
43
|
+
try {
|
|
44
|
+
const result = await ctx.memoryService.query(input);
|
|
45
|
+
const memories = result.memories.map((m) => ({
|
|
46
|
+
...toMemorySearchResult(m),
|
|
47
|
+
relevance: m.relevance,
|
|
48
|
+
}));
|
|
49
|
+
return ok({ memories, total: result.total });
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return err(wrapError(e));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── Update ───────────────────────────────────────────────────────────
|
|
56
|
+
export async function updateMemory(ctx, input) {
|
|
57
|
+
try {
|
|
58
|
+
const result = await ctx.memoryService.update(input);
|
|
59
|
+
return ok(result);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
return err(wrapError(e));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ─── Delete (soft) ───────────────────────────────────────────────────
|
|
66
|
+
export async function deleteMemory(ctx, input) {
|
|
67
|
+
try {
|
|
68
|
+
const result = await ctx.memoryService.delete(input);
|
|
69
|
+
return ok(result);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
return err(wrapError(e));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
76
|
+
function toMemorySearchResult(raw) {
|
|
77
|
+
return {
|
|
78
|
+
memory_id: (raw.id ?? raw.memory_id ?? ''),
|
|
79
|
+
content: (raw.content ?? ''),
|
|
80
|
+
content_type: (raw.content_type ?? 'general'),
|
|
81
|
+
tags: (raw.tags ?? []),
|
|
82
|
+
weight: (raw.weight ?? raw.computed_weight ?? 0.5),
|
|
83
|
+
trust_score: (raw.trust_score ?? 0.25),
|
|
84
|
+
created_at: (raw.created_at ?? ''),
|
|
85
|
+
updated_at: (raw.updated_at ?? ''),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function wrapError(e) {
|
|
89
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
90
|
+
return internal(message);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../src/web/memories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UserPreferences } from '../types/preferences.types.js';
|
|
2
|
+
import type { WebSDKContext } from './context.js';
|
|
3
|
+
import type { Result } from './result.js';
|
|
4
|
+
export declare function getPreferences(ctx: WebSDKContext): Promise<Result<UserPreferences>>;
|
|
5
|
+
export declare function updatePreferences(ctx: WebSDKContext, input: Partial<UserPreferences>): Promise<Result<UserPreferences>>;
|
|
6
|
+
//# sourceMappingURL=preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/web/preferences.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAUlC;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAUlC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/web/preferences.ts
|
|
2
|
+
// Preferences use cases — wraps PreferencesDatabaseService with Result<T, E>
|
|
3
|
+
import { ok, err } from './result.js';
|
|
4
|
+
import { internal, validation } from './errors.js';
|
|
5
|
+
export async function getPreferences(ctx) {
|
|
6
|
+
if (!ctx.preferencesService) {
|
|
7
|
+
return err(validation('PreferencesDatabaseService not available in context'));
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const prefs = await ctx.preferencesService.getPreferences(ctx.userId);
|
|
11
|
+
return ok(prefs);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return err(wrapError(e));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function updatePreferences(ctx, input) {
|
|
18
|
+
if (!ctx.preferencesService) {
|
|
19
|
+
return err(validation('PreferencesDatabaseService not available in context'));
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const prefs = await ctx.preferencesService.updatePreferences(ctx.userId, input);
|
|
23
|
+
return ok(prefs);
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
return err(wrapError(e));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function wrapError(e) {
|
|
30
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
31
|
+
return internal(message);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/web/preferences.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,6EAA6E;AAM7E,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAkB;IAElB,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAkB,EAClB,KAA+B;IAE/B,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChF,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { WebSDKContext } from './context.js';
|
|
2
|
+
import type { Result } from './result.js';
|
|
3
|
+
import type { PaginatedResult, ProfileSearchResult } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create a profile memory and publish it to the 'profiles' space in one call.
|
|
6
|
+
* Enforces singleton: one profile per user.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createAndPublishProfile(ctx: WebSDKContext, input: {
|
|
9
|
+
display_name: string;
|
|
10
|
+
bio?: string;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
}): Promise<Result<{
|
|
13
|
+
memory_id: string;
|
|
14
|
+
space_id: string;
|
|
15
|
+
composite_id?: string;
|
|
16
|
+
}>>;
|
|
17
|
+
export declare function searchProfiles(ctx: WebSDKContext, input: {
|
|
18
|
+
query: string;
|
|
19
|
+
limit?: number;
|
|
20
|
+
offset?: number;
|
|
21
|
+
}): Promise<Result<PaginatedResult<ProfileSearchResult>>>;
|
|
22
|
+
export declare function retractProfile(ctx: WebSDKContext, input: {
|
|
23
|
+
memory_id: string;
|
|
24
|
+
}): Promise<Result<{
|
|
25
|
+
retracted: true;
|
|
26
|
+
}>>;
|
|
27
|
+
export declare function updateAndRepublishProfile(ctx: WebSDKContext, input: {
|
|
28
|
+
memory_id: string;
|
|
29
|
+
display_name?: string;
|
|
30
|
+
bio?: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
}): Promise<Result<{
|
|
33
|
+
memory_id: string;
|
|
34
|
+
composite_id?: string;
|
|
35
|
+
}>>;
|
|
36
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/web/profiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOvE;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyCjF;AAID,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAkCvD;AAID,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CAetC;AAID,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgC/D"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// src/web/profiles.ts
|
|
2
|
+
// Profile compound use cases — combine memory CRUD + space publishing into single calls
|
|
3
|
+
import { ok, err } from './result.js';
|
|
4
|
+
import { internal, conflict } from './errors.js';
|
|
5
|
+
import { publishToSpace } from './spaces.js';
|
|
6
|
+
import { retractFromSpace, reviseInSpace } from './spaces.js';
|
|
7
|
+
import { paginated } from './types.js';
|
|
8
|
+
const PROFILES_SPACE = 'profiles';
|
|
9
|
+
// ─── Create and Publish Profile ───────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Create a profile memory and publish it to the 'profiles' space in one call.
|
|
12
|
+
* Enforces singleton: one profile per user.
|
|
13
|
+
*/
|
|
14
|
+
export async function createAndPublishProfile(ctx, input) {
|
|
15
|
+
try {
|
|
16
|
+
// Singleton check: search for existing profile
|
|
17
|
+
const existing = await ctx.spaceService.search({
|
|
18
|
+
query: ctx.userId,
|
|
19
|
+
spaces: [PROFILES_SPACE],
|
|
20
|
+
content_type: 'profile',
|
|
21
|
+
limit: 1,
|
|
22
|
+
});
|
|
23
|
+
if (existing.memories.length > 0) {
|
|
24
|
+
return err(conflict('User already has a published profile. Use updateAndRepublishProfile instead.'));
|
|
25
|
+
}
|
|
26
|
+
// Build profile content
|
|
27
|
+
const content = buildProfileContent(input.display_name, input.bio, input.tags);
|
|
28
|
+
// Create memory
|
|
29
|
+
const memory = await ctx.memoryService.create({
|
|
30
|
+
content,
|
|
31
|
+
type: 'profile',
|
|
32
|
+
tags: input.tags ?? [],
|
|
33
|
+
});
|
|
34
|
+
// Publish to profiles space (auto-confirmed)
|
|
35
|
+
const publishResult = await publishToSpace(ctx, {
|
|
36
|
+
memory_id: memory.memory_id,
|
|
37
|
+
spaces: [PROFILES_SPACE],
|
|
38
|
+
});
|
|
39
|
+
if (!publishResult.ok) {
|
|
40
|
+
return err(publishResult.error);
|
|
41
|
+
}
|
|
42
|
+
return ok({
|
|
43
|
+
memory_id: memory.memory_id,
|
|
44
|
+
space_id: PROFILES_SPACE,
|
|
45
|
+
composite_id: publishResult.data.composite_id,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return err(wrapError(e));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ─── Search Profiles ──────────────────────────────────────────────────
|
|
53
|
+
export async function searchProfiles(ctx, input) {
|
|
54
|
+
try {
|
|
55
|
+
const limit = input.limit ?? 10;
|
|
56
|
+
const offset = input.offset ?? 0;
|
|
57
|
+
const result = await ctx.spaceService.search({
|
|
58
|
+
query: input.query,
|
|
59
|
+
spaces: [PROFILES_SPACE],
|
|
60
|
+
content_type: 'profile',
|
|
61
|
+
limit,
|
|
62
|
+
offset,
|
|
63
|
+
});
|
|
64
|
+
const items = result.memories.map((raw) => {
|
|
65
|
+
const compositeId = (raw.composite_id ?? '');
|
|
66
|
+
// Extract user_id from composite ID format: space:user_id:memory_id
|
|
67
|
+
const parts = compositeId.split(':');
|
|
68
|
+
const userId = parts.length >= 2 ? parts[1] : (raw.user_id ?? raw.author_id ?? '');
|
|
69
|
+
return {
|
|
70
|
+
user_id: userId,
|
|
71
|
+
display_name: extractDisplayName(raw),
|
|
72
|
+
bio: extractBio(raw),
|
|
73
|
+
tags: (raw.tags ?? []),
|
|
74
|
+
similarity: 0, // space search doesn't return similarity
|
|
75
|
+
memory_id: (raw.id ?? raw.memory_id ?? ''),
|
|
76
|
+
composite_id: compositeId,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
return ok(paginated(items, result.total, limit, offset));
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return err(wrapError(e));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ─── Retract Profile ──────────────────────────────────────────────────
|
|
86
|
+
export async function retractProfile(ctx, input) {
|
|
87
|
+
try {
|
|
88
|
+
const result = await retractFromSpace(ctx, {
|
|
89
|
+
memory_id: input.memory_id,
|
|
90
|
+
spaces: [PROFILES_SPACE],
|
|
91
|
+
});
|
|
92
|
+
if (!result.ok) {
|
|
93
|
+
return err(result.error);
|
|
94
|
+
}
|
|
95
|
+
return ok({ retracted: true });
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
return err(wrapError(e));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ─── Update and Republish Profile ─────────────────────────────────────
|
|
102
|
+
export async function updateAndRepublishProfile(ctx, input) {
|
|
103
|
+
try {
|
|
104
|
+
// Build updated content
|
|
105
|
+
const updateFields = {};
|
|
106
|
+
if (input.display_name || input.bio) {
|
|
107
|
+
updateFields.content = buildProfileContent(input.display_name ?? '', input.bio, input.tags);
|
|
108
|
+
}
|
|
109
|
+
if (input.tags) {
|
|
110
|
+
updateFields.tags = input.tags;
|
|
111
|
+
}
|
|
112
|
+
// Update memory
|
|
113
|
+
await ctx.memoryService.update({
|
|
114
|
+
memory_id: input.memory_id,
|
|
115
|
+
content: updateFields.content,
|
|
116
|
+
tags: updateFields.tags,
|
|
117
|
+
});
|
|
118
|
+
// Revise in profiles space (auto-confirmed)
|
|
119
|
+
const reviseResult = await reviseInSpace(ctx, { memory_id: input.memory_id });
|
|
120
|
+
return ok({
|
|
121
|
+
memory_id: input.memory_id,
|
|
122
|
+
composite_id: reviseResult.ok ? undefined : undefined, // revise doesn't return composite_id
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return err(wrapError(e));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
130
|
+
function buildProfileContent(displayName, bio, tags) {
|
|
131
|
+
const parts = [`Name: ${displayName}`];
|
|
132
|
+
if (bio)
|
|
133
|
+
parts.push(`Bio: ${bio}`);
|
|
134
|
+
if (tags && tags.length > 0)
|
|
135
|
+
parts.push(`Tags: ${tags.join(', ')}`);
|
|
136
|
+
return parts.join('\n');
|
|
137
|
+
}
|
|
138
|
+
function extractDisplayName(raw) {
|
|
139
|
+
const content = (raw.content ?? '');
|
|
140
|
+
const match = content.match(/^Name:\s*(.+)/m);
|
|
141
|
+
return match ? match[1].trim() : (raw.title ?? '');
|
|
142
|
+
}
|
|
143
|
+
function extractBio(raw) {
|
|
144
|
+
const content = (raw.content ?? '');
|
|
145
|
+
const match = content.match(/^Bio:\s*(.+)/m);
|
|
146
|
+
return match ? match[1].trim() : undefined;
|
|
147
|
+
}
|
|
148
|
+
function wrapError(e) {
|
|
149
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
150
|
+
return internal(message);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/web/profiles.ts"],"names":[],"mappings":"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"}
|