@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.
Files changed (51) hide show
  1. package/README.md +9 -3
  2. package/lib/agent-runtime.d.ts +4 -0
  3. package/lib/agent-runtime.d.ts.map +1 -1
  4. package/lib/agent-runtime.js +78 -12
  5. package/lib/agent-runtime.js.map +1 -1
  6. package/lib/api.d.ts.map +1 -1
  7. package/lib/api.js +15 -2
  8. package/lib/api.js.map +1 -1
  9. package/lib/client-api.d.ts +17 -0
  10. package/lib/client-api.d.ts.map +1 -1
  11. package/lib/client-api.js.map +1 -1
  12. package/lib/client.d.ts.map +1 -1
  13. package/lib/client.js +1541 -722
  14. package/lib/client.js.map +4 -4
  15. package/lib/concern-domain.d.ts +11 -0
  16. package/lib/concern-domain.d.ts.map +1 -1
  17. package/lib/concern-domain.js +30 -0
  18. package/lib/concern-domain.js.map +1 -1
  19. package/lib/concern-store.d.ts +28 -1
  20. package/lib/concern-store.d.ts.map +1 -1
  21. package/lib/concern-store.js +91 -7
  22. package/lib/concern-store.js.map +1 -1
  23. package/lib/concern-tool.d.ts +25 -0
  24. package/lib/concern-tool.d.ts.map +1 -0
  25. package/lib/concern-tool.js +145 -0
  26. package/lib/concern-tool.js.map +1 -0
  27. package/lib/glass-surface.d.ts +20 -0
  28. package/lib/glass-surface.d.ts.map +1 -0
  29. package/lib/glass-surface.js +119 -0
  30. package/lib/glass-surface.js.map +1 -0
  31. package/lib/index.d.ts.map +1 -1
  32. package/lib/index.js +3 -0
  33. package/lib/index.js.map +1 -1
  34. package/lib/memory-domain.d.ts +36 -7
  35. package/lib/memory-domain.d.ts.map +1 -1
  36. package/lib/memory-prompt-context.d.ts +20 -0
  37. package/lib/memory-prompt-context.d.ts.map +1 -0
  38. package/lib/memory-prompt-context.js +138 -0
  39. package/lib/memory-prompt-context.js.map +1 -0
  40. package/lib/memory-reflection.d.ts.map +1 -1
  41. package/lib/memory-reflection.js +30 -22
  42. package/lib/memory-reflection.js.map +1 -1
  43. package/lib/memory-store.d.ts +5 -1
  44. package/lib/memory-store.d.ts.map +1 -1
  45. package/lib/memory-store.js +155 -8
  46. package/lib/memory-store.js.map +1 -1
  47. package/lib/profile-domain.d.ts +7 -0
  48. package/lib/profile-domain.d.ts.map +1 -0
  49. package/lib/profile-domain.js +56 -0
  50. package/lib/profile-domain.js.map +1 -0
  51. 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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"}
@@ -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;AAajG,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,CA0DnE"}
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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: Array<{
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":"AAAA,OAAO,KAAK,EAAE,gCAAgC,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE7F,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS,CAAA;AACjG,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAA;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,gCAAgC,CAAA;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,gBAAgB,GAAG,WAAW,CAAC,CAAA;IACjG,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAAA;AACnG,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,kBAAkB,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC3G,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,SAAS,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChI"}
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