@lemoncat7/dsh-partner 1.3.9 → 1.4.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 +9 -3
- package/lib/agent-runtime.d.ts +4 -0
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +78 -12
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +15 -2
- package/lib/api.js.map +1 -1
- package/lib/client-api.d.ts +17 -0
- package/lib/client-api.d.ts.map +1 -1
- package/lib/client-api.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +1541 -722
- package/lib/client.js.map +4 -4
- package/lib/concern-domain.d.ts +11 -0
- package/lib/concern-domain.d.ts.map +1 -1
- package/lib/concern-domain.js +30 -0
- package/lib/concern-domain.js.map +1 -1
- package/lib/concern-store.d.ts +28 -1
- package/lib/concern-store.d.ts.map +1 -1
- package/lib/concern-store.js +91 -7
- package/lib/concern-store.js.map +1 -1
- package/lib/concern-tool.d.ts +25 -0
- package/lib/concern-tool.d.ts.map +1 -0
- package/lib/concern-tool.js +145 -0
- package/lib/concern-tool.js.map +1 -0
- package/lib/glass-surface.d.ts +20 -0
- package/lib/glass-surface.d.ts.map +1 -0
- package/lib/glass-surface.js +119 -0
- package/lib/glass-surface.js.map +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/memory-domain.d.ts +36 -7
- package/lib/memory-domain.d.ts.map +1 -1
- package/lib/memory-prompt-context.d.ts +20 -0
- package/lib/memory-prompt-context.d.ts.map +1 -0
- package/lib/memory-prompt-context.js +138 -0
- package/lib/memory-prompt-context.js.map +1 -0
- package/lib/memory-reflection.d.ts.map +1 -1
- package/lib/memory-reflection.js +30 -22
- package/lib/memory-reflection.js.map +1 -1
- package/lib/memory-store.d.ts +5 -1
- package/lib/memory-store.d.ts.map +1 -1
- package/lib/memory-store.js +155 -8
- package/lib/memory-store.js.map +1 -1
- package/lib/profile-domain.d.ts +7 -0
- package/lib/profile-domain.d.ts.map +1 -0
- package/lib/profile-domain.js +56 -0
- package/lib/profile-domain.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { extractConcernResources } from './concern-domain.js';
|
|
2
|
+
import { explicitConcernDirective } from './memory-reflection.js';
|
|
3
|
+
const TOOL_NAME = 'partner_concern_suggest';
|
|
4
|
+
/** Register one compact, partner-session-only tool for evidence-backed implicit concern candidates. */
|
|
5
|
+
export function registerPartnerConcernTool(ctx, store, concerns) {
|
|
6
|
+
const disposeTool = ctx.tools.register(concernSuggestionTool(store, concerns));
|
|
7
|
+
const disposeVisibility = installVisibility(ctx, store);
|
|
8
|
+
return () => { disposeVisibility(); disposeTool(); };
|
|
9
|
+
}
|
|
10
|
+
function concernSuggestionTool(store, concerns) {
|
|
11
|
+
return {
|
|
12
|
+
name: TOOL_NAME,
|
|
13
|
+
description: 'Suggest one implicit concern only when the current user message gives direct evidence of a concrete unresolved matter worth checking later. Do not use for ordinary preferences, identity, broad interests, completed work, or an explicit "remind/watch this" request. Evidence must be an exact excerpt from the current user message. The backend may reject or merge the candidate.',
|
|
14
|
+
parameters: {
|
|
15
|
+
type: 'object', additionalProperties: false,
|
|
16
|
+
properties: {
|
|
17
|
+
subject: { type: 'string', description: 'Specific unresolved matter, at most 120 characters.' },
|
|
18
|
+
reason: { type: 'string', description: 'Why it remains open and merits later observation, at most 400 characters.' },
|
|
19
|
+
evidence: { type: 'string', description: 'Exact supporting excerpt from the current user message, at most 500 characters.' },
|
|
20
|
+
watchKind: { type: 'string', enum: ['auto', 'knowledge', 'workspace', 'web'] },
|
|
21
|
+
watchQuery: { type: 'string', description: 'Concrete future change to check, at most 300 characters.' },
|
|
22
|
+
priority: { type: 'number', minimum: 0, maximum: 1 },
|
|
23
|
+
confidence: { type: 'number', minimum: 0, maximum: 1 },
|
|
24
|
+
},
|
|
25
|
+
required: ['subject', 'reason', 'evidence', 'watchKind', 'watchQuery', 'priority', 'confidence'],
|
|
26
|
+
},
|
|
27
|
+
output: {
|
|
28
|
+
schema: { type: 'string' },
|
|
29
|
+
render: (_args, value) => [{ type: 'text', text: String(value) }],
|
|
30
|
+
},
|
|
31
|
+
presentCall: () => ({ card: 'generic', title: '伙伴发现待关注事项' }),
|
|
32
|
+
async execute(raw, exec) {
|
|
33
|
+
const agent = requireAgent(exec);
|
|
34
|
+
const route = store.snapshot().sessions.find(item => item.sessionId === agent.session.id);
|
|
35
|
+
if (route === undefined)
|
|
36
|
+
throw new Error('partner_concern_suggest is only available in a partner-owned conversation');
|
|
37
|
+
const companion = store.snapshot().companions.find(item => item.id === route.companionId);
|
|
38
|
+
if (companion === undefined || !companion.automation.memory.enabled)
|
|
39
|
+
throw new Error('伙伴长期记忆未启用,不能提交隐式关注');
|
|
40
|
+
const currentUserText = latestUserText(agent);
|
|
41
|
+
if (explicitConcernDirective(currentUserText))
|
|
42
|
+
throw new Error('用户已经明确要求关注;该请求由明确关注流程处理,不应提交为隐式关注');
|
|
43
|
+
const suggestion = validateConcernSuggestion(raw, currentUserText);
|
|
44
|
+
const candidate = {
|
|
45
|
+
subject: suggestion.subject, reason: suggestion.reason, operation: 'upsert', priority: suggestion.priority,
|
|
46
|
+
confidence: suggestion.confidence, watchKind: suggestion.watchKind, watchQuery: suggestion.watchQuery,
|
|
47
|
+
resources: extractConcernResources(`${suggestion.subject} ${suggestion.reason} ${suggestion.evidence}`),
|
|
48
|
+
};
|
|
49
|
+
const result = await concerns.ingestCandidates(route.companionId, `${route.channelId}:${route.userId}`, [candidate], 'implicit', Date.now(), {
|
|
50
|
+
source: 'tool', sessionId: agent.session.id, evidence: suggestion.evidence, maxImplicitCreates: 1,
|
|
51
|
+
});
|
|
52
|
+
const entry = result.entries[0];
|
|
53
|
+
return JSON.stringify({
|
|
54
|
+
outcome: entry?.decision ?? 'rejected',
|
|
55
|
+
subject: entry?.subject ?? suggestion.subject,
|
|
56
|
+
reason: entry?.reason ?? '候选未被处理',
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function validateConcernSuggestion(value, currentUserText) {
|
|
62
|
+
const input = object(value);
|
|
63
|
+
const suggestion = {
|
|
64
|
+
subject: text(input.subject, 'subject', 120),
|
|
65
|
+
reason: text(input.reason, 'reason', 400),
|
|
66
|
+
evidence: text(input.evidence, 'evidence', 500),
|
|
67
|
+
watchKind: watchKind(input.watchKind),
|
|
68
|
+
watchQuery: text(input.watchQuery, 'watchQuery', 300),
|
|
69
|
+
priority: score(input.priority, 'priority'),
|
|
70
|
+
confidence: score(input.confidence, 'confidence'),
|
|
71
|
+
};
|
|
72
|
+
if (!normalized(currentUserText).includes(normalized(suggestion.evidence))) {
|
|
73
|
+
throw new Error('evidence must be an exact excerpt from the current user message');
|
|
74
|
+
}
|
|
75
|
+
return suggestion;
|
|
76
|
+
}
|
|
77
|
+
export function applyConcernToolVisibility(assembly, enabled) {
|
|
78
|
+
if (!enabled)
|
|
79
|
+
assembly.tools = assembly.tools.filter(schema => schema.name !== TOOL_NAME);
|
|
80
|
+
}
|
|
81
|
+
function installVisibility(ctx, store) {
|
|
82
|
+
const attached = new Map();
|
|
83
|
+
const attach = (agent) => {
|
|
84
|
+
if (attached.has(agent))
|
|
85
|
+
return;
|
|
86
|
+
const dispose = agent.ctx.on('system-prompt/assemble', async (_assembly, _context, next) => {
|
|
87
|
+
const result = await next();
|
|
88
|
+
const route = store.snapshot().sessions.find(item => item.sessionId === agent.session.id);
|
|
89
|
+
const companion = route === undefined ? undefined : store.snapshot().companions.find(item => item.id === route.companionId);
|
|
90
|
+
applyConcernToolVisibility(result, route !== undefined && companion?.automation.memory.enabled === true);
|
|
91
|
+
return result;
|
|
92
|
+
});
|
|
93
|
+
attached.set(agent, dispose);
|
|
94
|
+
};
|
|
95
|
+
for (const agent of ctx.agents.list())
|
|
96
|
+
attach(agent);
|
|
97
|
+
const disposeCreated = ctx.on('agent/created', ({ agent }) => attach(agent));
|
|
98
|
+
const disposeDisposed = ctx.on('agent/disposed', ({ agent }) => {
|
|
99
|
+
attached.get(agent)?.();
|
|
100
|
+
attached.delete(agent);
|
|
101
|
+
});
|
|
102
|
+
return () => {
|
|
103
|
+
disposeDisposed();
|
|
104
|
+
disposeCreated();
|
|
105
|
+
for (const dispose of attached.values())
|
|
106
|
+
dispose();
|
|
107
|
+
attached.clear();
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function requireAgent(exec) {
|
|
111
|
+
if (exec.agent === undefined)
|
|
112
|
+
throw new Error('partner_concern_suggest requires an active agent conversation');
|
|
113
|
+
return exec.agent;
|
|
114
|
+
}
|
|
115
|
+
function latestUserText(agent) {
|
|
116
|
+
for (let index = agent.session.events.length - 1; index >= 0; index -= 1) {
|
|
117
|
+
const event = agent.session.events[index];
|
|
118
|
+
if (event?.type !== 'user/message' || event.data.source.kind !== 'user')
|
|
119
|
+
continue;
|
|
120
|
+
return event.data.content.flatMap(block => block.type === 'text' ? [block.text] : []).join('\n').trim();
|
|
121
|
+
}
|
|
122
|
+
throw new Error('current partner turn has no user message evidence');
|
|
123
|
+
}
|
|
124
|
+
function object(value) {
|
|
125
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
126
|
+
throw new Error('arguments must be an object');
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
function text(value, name, max) {
|
|
130
|
+
if (typeof value !== 'string' || value.trim().length === 0 || value.length > max)
|
|
131
|
+
throw new Error(`${name} must be a non-empty string with at most ${max} characters`);
|
|
132
|
+
return value.replace(/\s+/gu, ' ').trim();
|
|
133
|
+
}
|
|
134
|
+
function score(value, name) {
|
|
135
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 1)
|
|
136
|
+
throw new Error(`${name} must be a number between 0 and 1`);
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
function watchKind(value) {
|
|
140
|
+
if (value !== 'auto' && value !== 'knowledge' && value !== 'workspace' && value !== 'web')
|
|
141
|
+
throw new Error('watchKind is invalid');
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
144
|
+
function normalized(value) { return value.normalize('NFKC').replace(/\s+/gu, ' ').trim(); }
|
|
145
|
+
//# sourceMappingURL=concern-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concern-tool.js","sourceRoot":"","sources":["../src/concern-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
type GlassElement = 'header' | 'aside' | 'section' | 'article' | 'div' | 'button';
|
|
3
|
+
interface GlassSurfaceProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'className'> {
|
|
4
|
+
as: GlassElement;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
className: string;
|
|
7
|
+
borderRadius: number;
|
|
8
|
+
borderWidth?: number;
|
|
9
|
+
brightness?: number;
|
|
10
|
+
blur?: number;
|
|
11
|
+
distortionScale?: number;
|
|
12
|
+
interactive?: boolean;
|
|
13
|
+
opacity?: number;
|
|
14
|
+
saturation?: number;
|
|
15
|
+
type?: 'button' | 'submit' | 'reset';
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function GlassSurface({ as: Element, children, className, borderRadius, borderWidth, brightness, blur, distortionScale, interactive, opacity, saturation, ...elementProps }: GlassSurfaceProps): JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=glass-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glass-surface.d.ts","sourceRoot":"","sources":["../src/glass-surface.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAEd,KAAK,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAA;AAEjF,UAAU,iBAAkB,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IAC7F,EAAE,EAAE,YAAY,CAAA;IAChB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AA8CD,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EAAE,OAAO,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAiB,EACjB,UAAe,EACf,IAAS,EACT,eAAqB,EACrB,WAAmB,EACnB,OAAa,EACb,UAAiB,EACjB,GAAG,YAAY,EAChB,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAyHjC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useRef, useState, } from 'react';
|
|
3
|
+
function supportsSvgBackdropFilter(filterId) {
|
|
4
|
+
if (typeof window === 'undefined' || typeof document === 'undefined')
|
|
5
|
+
return false;
|
|
6
|
+
if (window.matchMedia('(prefers-reduced-transparency: reduce)').matches)
|
|
7
|
+
return false;
|
|
8
|
+
const userAgent = navigator.userAgent;
|
|
9
|
+
if (/Firefox/i.test(userAgent) || (/Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent)))
|
|
10
|
+
return false;
|
|
11
|
+
const probe = document.createElement('div');
|
|
12
|
+
probe.style.backdropFilter = `url(#${filterId})`;
|
|
13
|
+
return probe.style.backdropFilter !== '';
|
|
14
|
+
}
|
|
15
|
+
function displacementMap(width, height, radius, borderWidth, brightness, opacity, blur, redGradientId, blueGradientId) {
|
|
16
|
+
const edge = Math.max(1, Math.min(width, height) * borderWidth * .5);
|
|
17
|
+
const innerWidth = Math.max(1, width - edge * 2);
|
|
18
|
+
const innerHeight = Math.max(1, height - edge * 2);
|
|
19
|
+
const svg = `<svg viewBox="0 0 ${width} ${height}" xmlns="http://www.w3.org/2000/svg">
|
|
20
|
+
<defs>
|
|
21
|
+
<linearGradient id="${redGradientId}" x1="100%" y1="0%" x2="0%" y2="0%"><stop offset="0%" stop-color="#0000"/><stop offset="100%" stop-color="red"/></linearGradient>
|
|
22
|
+
<linearGradient id="${blueGradientId}" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#0000"/><stop offset="100%" stop-color="blue"/></linearGradient>
|
|
23
|
+
</defs>
|
|
24
|
+
<rect width="${width}" height="${height}" fill="black"/>
|
|
25
|
+
<rect width="${width}" height="${height}" rx="${radius}" fill="url(#${redGradientId})"/>
|
|
26
|
+
<rect width="${width}" height="${height}" rx="${radius}" fill="url(#${blueGradientId})" style="mix-blend-mode:difference"/>
|
|
27
|
+
<rect x="${edge}" y="${edge}" width="${innerWidth}" height="${innerHeight}" rx="${radius}" fill="hsl(0 0% ${brightness}% / ${opacity})" style="filter:blur(${blur}px)"/>
|
|
28
|
+
</svg>`;
|
|
29
|
+
return `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
|
30
|
+
}
|
|
31
|
+
export function GlassSurface({ as: Element, children, className, borderRadius, borderWidth = .07, brightness = 50, blur = 11, distortionScale = -26, interactive = false, opacity = .93, saturation = 1.16, ...elementProps }) {
|
|
32
|
+
const uniqueId = useId().replace(/:/g, '-');
|
|
33
|
+
const filterId = `partner-glass-filter-${uniqueId}`;
|
|
34
|
+
const redGradientId = `partner-glass-red-${uniqueId}`;
|
|
35
|
+
const blueGradientId = `partner-glass-blue-${uniqueId}`;
|
|
36
|
+
const containerRef = useRef(null);
|
|
37
|
+
const imageRef = useRef(null);
|
|
38
|
+
const redRef = useRef(null);
|
|
39
|
+
const greenRef = useRef(null);
|
|
40
|
+
const blueRef = useRef(null);
|
|
41
|
+
const glareFrameRef = useRef(0);
|
|
42
|
+
const glarePositionRef = useRef({ x: 50, y: 50 });
|
|
43
|
+
const [svgSupported, setSvgSupported] = useState(false);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
setSvgSupported(supportsSvgBackdropFilter(filterId));
|
|
46
|
+
}, [filterId]);
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const element = containerRef.current;
|
|
49
|
+
const image = imageRef.current;
|
|
50
|
+
if (element === null || image === null)
|
|
51
|
+
return;
|
|
52
|
+
let frame = 0;
|
|
53
|
+
const update = () => {
|
|
54
|
+
frame = 0;
|
|
55
|
+
const rect = element.getBoundingClientRect();
|
|
56
|
+
const width = Math.max(1, Math.round(rect.width));
|
|
57
|
+
const height = Math.max(1, Math.round(rect.height));
|
|
58
|
+
image.setAttribute('href', displacementMap(width, height, Math.min(borderRadius, Math.min(width, height) / 2), borderWidth, brightness, opacity, blur, redGradientId, blueGradientId));
|
|
59
|
+
};
|
|
60
|
+
const schedule = () => {
|
|
61
|
+
if (frame === 0)
|
|
62
|
+
frame = requestAnimationFrame(update);
|
|
63
|
+
};
|
|
64
|
+
const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule);
|
|
65
|
+
observer?.observe(element);
|
|
66
|
+
schedule();
|
|
67
|
+
return () => {
|
|
68
|
+
if (frame !== 0)
|
|
69
|
+
cancelAnimationFrame(frame);
|
|
70
|
+
observer?.disconnect();
|
|
71
|
+
};
|
|
72
|
+
}, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
const channels = [redRef.current, greenRef.current, blueRef.current];
|
|
75
|
+
const offsets = [0, 5, 10];
|
|
76
|
+
channels.forEach((channel, index) => channel?.setAttribute('scale', String(distortionScale + (offsets[index] ?? 0))));
|
|
77
|
+
}, [distortionScale]);
|
|
78
|
+
useEffect(() => () => {
|
|
79
|
+
if (glareFrameRef.current !== 0)
|
|
80
|
+
cancelAnimationFrame(glareFrameRef.current);
|
|
81
|
+
}, []);
|
|
82
|
+
const renderGlare = () => {
|
|
83
|
+
glareFrameRef.current = 0;
|
|
84
|
+
const element = containerRef.current;
|
|
85
|
+
if (element === null)
|
|
86
|
+
return;
|
|
87
|
+
element.style.setProperty('--partner-glare-x', `${glarePositionRef.current.x}%`);
|
|
88
|
+
element.style.setProperty('--partner-glare-y', `${glarePositionRef.current.y}%`);
|
|
89
|
+
};
|
|
90
|
+
const scheduleGlare = () => {
|
|
91
|
+
if (glareFrameRef.current === 0)
|
|
92
|
+
glareFrameRef.current = requestAnimationFrame(renderGlare);
|
|
93
|
+
};
|
|
94
|
+
const moveGlare = (clientX, clientY) => {
|
|
95
|
+
const element = containerRef.current;
|
|
96
|
+
if (!interactive || element === null)
|
|
97
|
+
return;
|
|
98
|
+
const rect = element.getBoundingClientRect();
|
|
99
|
+
glarePositionRef.current = {
|
|
100
|
+
x: Math.max(0, Math.min(100, (clientX - rect.left) / rect.width * 100)),
|
|
101
|
+
y: Math.max(0, Math.min(100, (clientY - rect.top) / rect.height * 100)),
|
|
102
|
+
};
|
|
103
|
+
scheduleGlare();
|
|
104
|
+
};
|
|
105
|
+
const resetGlare = () => {
|
|
106
|
+
if (!interactive)
|
|
107
|
+
return;
|
|
108
|
+
glarePositionRef.current = { x: 50, y: 50 };
|
|
109
|
+
scheduleGlare();
|
|
110
|
+
};
|
|
111
|
+
const style = {
|
|
112
|
+
'--partner-glass-filter-id': `url(#${filterId})`,
|
|
113
|
+
'--partner-glass-saturation': saturation,
|
|
114
|
+
'--partner-glare-x': '50%',
|
|
115
|
+
'--partner-glare-y': '50%',
|
|
116
|
+
};
|
|
117
|
+
return _jsxs(Element, { ...elementProps, ref: containerRef, className: `dsh-partner-glass-surface ${svgSupported ? 'is-svg' : 'is-fallback'}${interactive ? ' is-interactive' : ''} ${className}`, style: style, onPointerMove: interactive ? event => moveGlare(event.clientX, event.clientY) : undefined, onPointerLeave: interactive ? resetGlare : undefined, children: [_jsx("svg", { className: "dsh-partner-glass-filter", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", focusable: "false", children: _jsx("defs", { children: _jsxs("filter", { id: filterId, colorInterpolationFilters: "sRGB", x: "0%", y: "0%", width: "100%", height: "100%", children: [_jsx("feImage", { ref: imageRef, x: "0", y: "0", width: "100%", height: "100%", preserveAspectRatio: "none", result: "map" }), _jsx("feDisplacementMap", { ref: redRef, in: "SourceGraphic", in2: "map", result: "displaced-red" }), _jsx("feColorMatrix", { in: "displaced-red", type: "matrix", values: "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0", result: "red" }), _jsx("feDisplacementMap", { ref: greenRef, in: "SourceGraphic", in2: "map", result: "displaced-green" }), _jsx("feColorMatrix", { in: "displaced-green", type: "matrix", values: "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0", result: "green" }), _jsx("feDisplacementMap", { ref: blueRef, in: "SourceGraphic", in2: "map", result: "displaced-blue" }), _jsx("feColorMatrix", { in: "displaced-blue", type: "matrix", values: "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0", result: "blue" }), _jsx("feBlend", { in: "red", in2: "green", mode: "screen", result: "red-green" }), _jsx("feBlend", { in: "red-green", in2: "blue", mode: "screen", result: "output" }), _jsx("feGaussianBlur", { in: "output", stdDeviation: ".45" })] }) }) }), children] });
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=glass-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glass-surface.js","sourceRoot":"","sources":["../src/glass-surface.tsx"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAiB,KAAK,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAiB,KAAK,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAA;AAcjG,eAAO,MAAM,MAAM,0DAAe,CAAA;AAClC,MAAM,MAAM,MAAM,GAAG,aAAa,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,MAAM,UAA6J,CAAA;AAYhL,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA4DnE"}
|
package/lib/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { PartnerMemoryStore } from './memory-store.js';
|
|
|
10
10
|
import { MemoryReflectionService } from './memory-reflection.js';
|
|
11
11
|
import { DailyReviewScheduler } from './daily-review.js';
|
|
12
12
|
import { PartnerConcernStore } from './concern-store.js';
|
|
13
|
+
import { registerPartnerConcernTool } from './concern-tool.js';
|
|
13
14
|
export const Config = ConfigSchema;
|
|
14
15
|
export * from './domain.js';
|
|
15
16
|
export const name = 'dsh-partner';
|
|
@@ -43,6 +44,7 @@ export function apply(context, config) {
|
|
|
43
44
|
});
|
|
44
45
|
const reflection = new MemoryReflectionService(ctx, memory, concerns);
|
|
45
46
|
const agents = new PartnerAgentRuntime(ctx, store, resolved.defaultCwd, memory, reflection, concerns);
|
|
47
|
+
const disposeConcernTool = registerPartnerConcernTool(ctx, store, concerns);
|
|
46
48
|
const channels = new ChannelManager(ctx, store, credentials, agents);
|
|
47
49
|
const disposeSessionObserver = ctx.on('session/event', (session, event) => {
|
|
48
50
|
void agents.observeSessionEvent(session, event).catch(error => ctx.logger.warn(`dsh-partner memory reflection failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
@@ -75,6 +77,7 @@ export function apply(context, config) {
|
|
|
75
77
|
return async () => {
|
|
76
78
|
disposeApi?.();
|
|
77
79
|
disposeSessionObserver();
|
|
80
|
+
disposeConcernTool();
|
|
78
81
|
await heartbeat.close();
|
|
79
82
|
await dailyReview.close();
|
|
80
83
|
await channels.close();
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAA0B,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAA0B,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAElC,cAAc,aAAa,CAAA;AAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAA;AACjC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAA;AAYhL,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,MAAqB;IAC3D,MAAM,GAAG,GAAG,OAAyB,CAAA;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACzD,MAAM,WAAW,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC7E,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC7D,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACzD,IAAI,QAAQ,GAAG,CAAC;gBAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,QAAQ,8BAA8B,SAAS,CAAC,EAAE,EAAE,CAAC,CAAA;YAChH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACpE,MAAM,KAAK,GAAwB;gBACjC,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC1E,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,UAAmB;iBAC5F,CAAC,CAAC;gBACH,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAmB,EAAE,CAAC,CAAC;aACtE,CAAA;YACD,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YACjD,MAAM,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC;YAAE,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC9G,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU;oBAAE,OAAO,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAA;YAC7F,CAAC,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,IAAI,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QACrE,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;QACrG,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC3E,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACpE,MAAM,sBAAsB,GAAG,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACxE,KAAK,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;YAClL,KAAK,QAAQ,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5L,CAAC,CAAC,CAAA;QACF,QAAQ,CAAC,sBAAsB,EAAE,CAAA;QACjC,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACnG,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACvG,MAAM,KAAK,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACtC,IAAI,UAAoC,CAAA;QACxC,MAAM,QAAQ,GAAG,CAAC,OAAuB,EAAQ,EAAE;YACjD,IAAI,CAAC,QAAQ,CAAC,SAAS;gBAAE,OAAM;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAA8B,CAAA;YAC5F,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;YACxF,UAAU,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAA;QAChK,CAAC,CAAA;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAA;aAC5D,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;;YAC9C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QAC/F,IAAI,QAAQ,CAAC,iBAAiB;YAAE,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAA;QAC7D,SAAS,CAAC,KAAK,EAAE,CAAA;QACjB,WAAW,CAAC,KAAK,EAAE,CAAA;QACnB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,MAAM,eAAe,CAAC,CAAA;QAC7F,OAAO,KAAK,IAAI,EAAE;YAChB,UAAU,EAAE,EAAE,CAAA;YACd,sBAAsB,EAAE,CAAA;YACxB,kBAAkB,EAAE,CAAA;YACpB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;YACvB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;YACzB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;YACtB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC,CAAA;IACH,CAAC,EAAE,qBAAqB,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IACrB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/lib/memory-domain.d.ts
CHANGED
|
@@ -32,6 +32,20 @@ export interface PartnerMemory {
|
|
|
32
32
|
locked?: boolean;
|
|
33
33
|
evidence: MemoryEvidence[];
|
|
34
34
|
}
|
|
35
|
+
export interface UserProfileSnapshot {
|
|
36
|
+
companionId: string;
|
|
37
|
+
scopeId: string;
|
|
38
|
+
version: string;
|
|
39
|
+
updatedAt?: number;
|
|
40
|
+
entries: PartnerMemory[];
|
|
41
|
+
evidenceCount: number;
|
|
42
|
+
lockedCount: number;
|
|
43
|
+
}
|
|
44
|
+
export interface MemoryRecallContext {
|
|
45
|
+
profile: UserProfileSnapshot;
|
|
46
|
+
relevant: PartnerMemory[];
|
|
47
|
+
connections: MemoryContextConnection[];
|
|
48
|
+
}
|
|
35
49
|
export interface DailyReflection {
|
|
36
50
|
date: string;
|
|
37
51
|
companionId: string;
|
|
@@ -70,19 +84,34 @@ export interface MemoryRelation {
|
|
|
70
84
|
confidence: number;
|
|
71
85
|
updatedAt: number;
|
|
72
86
|
}
|
|
87
|
+
export interface MemoryContextConnection {
|
|
88
|
+
relation: MemoryRelation;
|
|
89
|
+
source: PartnerMemory;
|
|
90
|
+
target: PartnerMemory;
|
|
91
|
+
}
|
|
73
92
|
export interface DailyReviewTarget {
|
|
74
93
|
companionId: string;
|
|
75
94
|
scopeId: string;
|
|
76
95
|
date: string;
|
|
77
96
|
attempts: number;
|
|
78
97
|
}
|
|
98
|
+
export interface MemoryRelationCandidate {
|
|
99
|
+
sourceSubject: string;
|
|
100
|
+
sourceKind?: MemoryKind;
|
|
101
|
+
targetSubject: string;
|
|
102
|
+
targetKind?: MemoryKind;
|
|
103
|
+
kind: MemoryRelationKind;
|
|
104
|
+
label: string;
|
|
105
|
+
confidence: number;
|
|
106
|
+
operation: 'upsert' | 'remove';
|
|
107
|
+
}
|
|
108
|
+
export interface MemoryRelationReviewContext extends MemoryRelation {
|
|
109
|
+
sourceSubject: string;
|
|
110
|
+
sourceKind: MemoryKind;
|
|
111
|
+
targetSubject: string;
|
|
112
|
+
targetKind: MemoryKind;
|
|
113
|
+
}
|
|
79
114
|
export interface DailyReviewResult extends ReflectionResult {
|
|
80
|
-
relations:
|
|
81
|
-
sourceSubject: string;
|
|
82
|
-
targetSubject: string;
|
|
83
|
-
kind: MemoryRelationKind;
|
|
84
|
-
label: string;
|
|
85
|
-
confidence: number;
|
|
86
|
-
}>;
|
|
115
|
+
relations: MemoryRelationCandidate[];
|
|
87
116
|
}
|
|
88
117
|
//# sourceMappingURL=memory-domain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-domain.d.ts","sourceRoot":"","sources":["../src/memory-domain.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"memory-domain.d.ts","sourceRoot":"","sources":["../src/memory-domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PartnerConcern } from './concern-domain.js';
|
|
2
|
+
import type { ConversationTurn, DailyReflection, MemoryRelationReviewContext, PartnerMemory } from './memory-domain.js';
|
|
3
|
+
export declare const REFLECTION_MEMORY_CHAR_BUDGET = 6000;
|
|
4
|
+
export declare const REFLECTION_CONCERN_CHAR_BUDGET = 3500;
|
|
5
|
+
export declare const DAILY_TURN_CHAR_BUDGET = 14000;
|
|
6
|
+
export declare const DAILY_MEMORY_CHAR_BUDGET = 8000;
|
|
7
|
+
export declare const DAILY_RELATION_CHAR_BUDGET = 4000;
|
|
8
|
+
export declare const DAILY_CONCERN_CHAR_BUDGET = 3500;
|
|
9
|
+
interface DailyReviewSource {
|
|
10
|
+
reflection: DailyReflection;
|
|
11
|
+
memories: PartnerMemory[];
|
|
12
|
+
existingRelations: MemoryRelationReviewContext[];
|
|
13
|
+
turns: ConversationTurn[];
|
|
14
|
+
}
|
|
15
|
+
export declare function reflectionPromptInput(date: string, turn: ConversationTurn, memories: PartnerMemory[], diary: DailyReflection | undefined, concerns: PartnerConcern[]): string;
|
|
16
|
+
export declare function dailyReviewPromptInput(date: string, context: DailyReviewSource, concerns: PartnerConcern[]): string;
|
|
17
|
+
export declare function compactMemories(memories: PartnerMemory[], limit: number, charBudget: number): Array<Record<string, unknown>>;
|
|
18
|
+
export declare function compactTurns(turns: ConversationTurn[], charBudget: number): Array<Record<string, unknown>>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=memory-prompt-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-prompt-context.d.ts","sourceRoot":"","sources":["../src/memory-prompt-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvH,eAAO,MAAM,6BAA6B,OAAQ,CAAA;AAClD,eAAO,MAAM,8BAA8B,OAAQ,CAAA;AACnD,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAC5C,eAAO,MAAM,wBAAwB,OAAQ,CAAA;AAC7C,eAAO,MAAM,0BAA0B,OAAQ,CAAA;AAC/C,eAAO,MAAM,yBAAyB,OAAQ,CAAA;AAE9C,UAAU,iBAAiB;IACzB,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,iBAAiB,EAAE,2BAA2B,EAAE,CAAA;IAChD,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,QAAQ,EAAE,cAAc,EAAE,GACzB,MAAM,CAQR;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAcnH;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkB5H;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAc1G"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export const REFLECTION_MEMORY_CHAR_BUDGET = 6_000;
|
|
2
|
+
export const REFLECTION_CONCERN_CHAR_BUDGET = 3_500;
|
|
3
|
+
export const DAILY_TURN_CHAR_BUDGET = 14_000;
|
|
4
|
+
export const DAILY_MEMORY_CHAR_BUDGET = 8_000;
|
|
5
|
+
export const DAILY_RELATION_CHAR_BUDGET = 4_000;
|
|
6
|
+
export const DAILY_CONCERN_CHAR_BUDGET = 3_500;
|
|
7
|
+
export function reflectionPromptInput(date, turn, memories, diary, concerns) {
|
|
8
|
+
return JSON.stringify({
|
|
9
|
+
date,
|
|
10
|
+
existingDailyReflection: diary === undefined ? null : compactReflection(diary),
|
|
11
|
+
existingRelevantMemories: compactMemories(memories, 16, REFLECTION_MEMORY_CHAR_BUDGET),
|
|
12
|
+
existingConcerns: compactConcerns(concerns, 12, REFLECTION_CONCERN_CHAR_BUDGET),
|
|
13
|
+
newTurn: compactTurn(turn, 6_000, 2_500),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function dailyReviewPromptInput(date, context, concerns) {
|
|
17
|
+
return JSON.stringify({
|
|
18
|
+
date,
|
|
19
|
+
reflection: compactReflection(context.reflection),
|
|
20
|
+
currentMemories: compactMemories([...context.memories].sort((left, right) => right.updatedAt - left.updatedAt), 24, DAILY_MEMORY_CHAR_BUDGET),
|
|
21
|
+
existingRelations: compactRelations(context.existingRelations, 40, DAILY_RELATION_CHAR_BUDGET),
|
|
22
|
+
turns: compactTurns(context.turns, DAILY_TURN_CHAR_BUDGET),
|
|
23
|
+
existingConcerns: compactConcerns(concerns, 20, DAILY_CONCERN_CHAR_BUDGET),
|
|
24
|
+
contextPolicy: '上下文经过无损索引和有界文本压缩;所有轮次均保留。未列出的旧记忆与旧关系由存储层继续保留。',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function compactMemories(memories, limit, charBudget) {
|
|
28
|
+
const selected = memories.slice(0, limit);
|
|
29
|
+
return fitEntries(selected, charBudget, (memory, entryBudget) => {
|
|
30
|
+
const latest = memory.evidence.at(-1);
|
|
31
|
+
const base = {
|
|
32
|
+
id: memory.id,
|
|
33
|
+
kind: memory.kind,
|
|
34
|
+
subject: clip(memory.subject, 120),
|
|
35
|
+
confidence: precision(memory.confidence),
|
|
36
|
+
importance: precision(memory.importance),
|
|
37
|
+
evidenceCount: memory.evidence.length,
|
|
38
|
+
...(memory.locked ? { locked: true } : {}),
|
|
39
|
+
};
|
|
40
|
+
return fitTextFields(base, entryBudget, [
|
|
41
|
+
['content', memory.content, .82],
|
|
42
|
+
...(latest === undefined ? [] : [['latestEvidence', latest.excerpt, .18]]),
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function compactTurns(turns, charBudget) {
|
|
47
|
+
// A small per-turn floor keeps both speakers represented. The budget only grows
|
|
48
|
+
// beyond its target on exceptionally dense days where dropping a turn would be
|
|
49
|
+
// a larger semantic regression than retaining a minimal index of it.
|
|
50
|
+
const minimumTurnBudget = 48;
|
|
51
|
+
const completeTurnBudget = Math.max(charBudget, turns.length * minimumTurnBudget + turns.length + 1);
|
|
52
|
+
return fitEntries(turns, completeTurnBudget, (turn, entryBudget) => {
|
|
53
|
+
const base = { at: turn.at };
|
|
54
|
+
if (turn.concernDirective !== undefined)
|
|
55
|
+
base.concernDirective = {
|
|
56
|
+
action: turn.concernDirective.action,
|
|
57
|
+
subject: clip(turn.concernDirective.subject, 100),
|
|
58
|
+
};
|
|
59
|
+
return fitTextFields(base, entryBudget, [['user', turn.user, .64], ['assistant', turn.assistant, .36]]);
|
|
60
|
+
}, minimumTurnBudget);
|
|
61
|
+
}
|
|
62
|
+
function compactTurn(turn, userLimit, assistantLimit) {
|
|
63
|
+
return {
|
|
64
|
+
id: turn.id,
|
|
65
|
+
at: turn.at,
|
|
66
|
+
user: clip(turn.user, userLimit),
|
|
67
|
+
assistant: clip(turn.assistant, assistantLimit),
|
|
68
|
+
...(turn.concernDirective === undefined ? {} : { concernDirective: turn.concernDirective }),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function compactReflection(reflection) {
|
|
72
|
+
return {
|
|
73
|
+
date: reflection.date,
|
|
74
|
+
summary: clip(reflection.summary, 800),
|
|
75
|
+
events: compactStrings(reflection.events, 12, 100),
|
|
76
|
+
openTasks: compactStrings(reflection.openTasks, 20, 100),
|
|
77
|
+
completedTasks: compactStrings(reflection.completedTasks, 12, 100),
|
|
78
|
+
learnings: compactStrings(reflection.learnings, 12, 100),
|
|
79
|
+
turnCount: reflection.turnCount,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function compactConcerns(concerns, limit, charBudget) {
|
|
83
|
+
return fitEntries(concerns.slice(0, limit), charBudget, (concern, entryBudget) => fitTextFields({
|
|
84
|
+
id: concern.id,
|
|
85
|
+
origin: concern.origin,
|
|
86
|
+
state: concern.state,
|
|
87
|
+
priority: precision(concern.priority),
|
|
88
|
+
watchKind: concern.watchKind,
|
|
89
|
+
}, entryBudget, [['subject', concern.subject, .34], ['reason', concern.reason, .42], ['watchQuery', concern.watchQuery, .24]]));
|
|
90
|
+
}
|
|
91
|
+
function compactRelations(relations, limit, charBudget) {
|
|
92
|
+
return fitEntries(relations.slice(0, limit), charBudget, (relation, entryBudget) => fitTextFields({
|
|
93
|
+
id: relation.id,
|
|
94
|
+
sourceSubject: clip(relation.sourceSubject, 120),
|
|
95
|
+
sourceKind: relation.sourceKind,
|
|
96
|
+
targetSubject: clip(relation.targetSubject, 120),
|
|
97
|
+
targetKind: relation.targetKind,
|
|
98
|
+
kind: relation.kind,
|
|
99
|
+
confidence: precision(relation.confidence),
|
|
100
|
+
}, entryBudget, [['label', relation.label, 1]]));
|
|
101
|
+
}
|
|
102
|
+
function fitEntries(items, charBudget, project, minimumEntryBudget = 180) {
|
|
103
|
+
if (items.length === 0)
|
|
104
|
+
return [];
|
|
105
|
+
const maximumCount = Math.max(1, Math.floor((charBudget - 1) / (minimumEntryBudget + 1)));
|
|
106
|
+
const selected = items.slice(0, maximumCount);
|
|
107
|
+
const entryBudget = Math.max(minimumEntryBudget, Math.floor((charBudget - selected.length - 1) / selected.length));
|
|
108
|
+
return selected.map(item => project(item, entryBudget));
|
|
109
|
+
}
|
|
110
|
+
function fitTextFields(base, entryBudget, fields) {
|
|
111
|
+
const overhead = JSON.stringify(base).length + fields.reduce((sum, [name]) => sum + name.length + 6, 0);
|
|
112
|
+
const available = Math.max(fields.length * 12, entryBudget - overhead);
|
|
113
|
+
const totalWeight = fields.reduce((sum, field) => sum + field[2], 0) || 1;
|
|
114
|
+
const result = { ...base };
|
|
115
|
+
for (const [name, value, weight] of fields)
|
|
116
|
+
result[name] = clip(value, Math.max(12, Math.floor(available * weight / totalWeight)));
|
|
117
|
+
const excess = JSON.stringify(result).length - entryBudget;
|
|
118
|
+
if (excess > 0 && fields.length > 0) {
|
|
119
|
+
const [name] = fields[0];
|
|
120
|
+
result[name] = clip(String(result[name] ?? ''), Math.max(12, String(result[name] ?? '').length - excess));
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
function compactStrings(values, limit, maxLength) {
|
|
125
|
+
return values.slice(0, limit).map(value => clip(value, maxLength)).filter(Boolean);
|
|
126
|
+
}
|
|
127
|
+
function clip(value, maximum) {
|
|
128
|
+
const text = value.replace(/\s+/g, ' ').trim();
|
|
129
|
+
if (text.length <= maximum)
|
|
130
|
+
return text;
|
|
131
|
+
if (maximum < 16)
|
|
132
|
+
return text.slice(0, maximum);
|
|
133
|
+
const remaining = maximum - 1;
|
|
134
|
+
const head = Math.ceil(remaining * .7);
|
|
135
|
+
return `${text.slice(0, head)}…${text.slice(-(remaining - head))}`;
|
|
136
|
+
}
|
|
137
|
+
function precision(value) { return Math.round(value * 1_000) / 1_000; }
|
|
138
|
+
//# sourceMappingURL=memory-prompt-context.js.map
|