@lemoncat7/dsh-partner 1.1.6 → 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 (88) hide show
  1. package/README.md +21 -6
  2. package/lib/agent-runtime.d.ts +46 -3
  3. package/lib/agent-runtime.d.ts.map +1 -1
  4. package/lib/agent-runtime.js +599 -50
  5. package/lib/agent-runtime.js.map +1 -1
  6. package/lib/api.d.ts +2 -0
  7. package/lib/api.d.ts.map +1 -1
  8. package/lib/api.js +44 -4
  9. package/lib/api.js.map +1 -1
  10. package/lib/autonomy.d.ts +2 -7
  11. package/lib/autonomy.d.ts.map +1 -1
  12. package/lib/autonomy.js +40 -28
  13. package/lib/autonomy.js.map +1 -1
  14. package/lib/channels/manager.d.ts +1 -0
  15. package/lib/channels/manager.d.ts.map +1 -1
  16. package/lib/channels/manager.js +11 -3
  17. package/lib/channels/manager.js.map +1 -1
  18. package/lib/client-api.d.ts +60 -0
  19. package/lib/client-api.d.ts.map +1 -1
  20. package/lib/client-api.js.map +1 -1
  21. package/lib/client.d.ts.map +1 -1
  22. package/lib/client.js +1880 -620
  23. package/lib/client.js.map +4 -4
  24. package/lib/concern-domain.d.ts +132 -0
  25. package/lib/concern-domain.d.ts.map +1 -0
  26. package/lib/concern-domain.js +212 -0
  27. package/lib/concern-domain.js.map +1 -0
  28. package/lib/concern-notification.d.ts +6 -0
  29. package/lib/concern-notification.d.ts.map +1 -0
  30. package/lib/concern-notification.js +27 -0
  31. package/lib/concern-notification.js.map +1 -0
  32. package/lib/concern-sources.d.ts +10 -0
  33. package/lib/concern-sources.d.ts.map +1 -0
  34. package/lib/concern-sources.js +81 -0
  35. package/lib/concern-sources.js.map +1 -0
  36. package/lib/concern-store.d.ts +68 -0
  37. package/lib/concern-store.d.ts.map +1 -0
  38. package/lib/concern-store.js +611 -0
  39. package/lib/concern-store.js.map +1 -0
  40. package/lib/concern-tool.d.ts +25 -0
  41. package/lib/concern-tool.d.ts.map +1 -0
  42. package/lib/concern-tool.js +145 -0
  43. package/lib/concern-tool.js.map +1 -0
  44. package/lib/daily-review.d.ts +3 -1
  45. package/lib/daily-review.d.ts.map +1 -1
  46. package/lib/daily-review.js +8 -2
  47. package/lib/daily-review.js.map +1 -1
  48. package/lib/domain.d.ts +4 -1
  49. package/lib/domain.d.ts.map +1 -1
  50. package/lib/domain.js +23 -0
  51. package/lib/domain.js.map +1 -1
  52. package/lib/glass-surface.d.ts +20 -0
  53. package/lib/glass-surface.d.ts.map +1 -0
  54. package/lib/glass-surface.js +119 -0
  55. package/lib/glass-surface.js.map +1 -0
  56. package/lib/heartbeat.d.ts +10 -2
  57. package/lib/heartbeat.d.ts.map +1 -1
  58. package/lib/heartbeat.js +81 -17
  59. package/lib/heartbeat.js.map +1 -1
  60. package/lib/index.d.ts.map +1 -1
  61. package/lib/index.js +36 -5
  62. package/lib/index.js.map +1 -1
  63. package/lib/memory-domain.d.ts +39 -7
  64. package/lib/memory-domain.d.ts.map +1 -1
  65. package/lib/memory-prompt-context.d.ts +20 -0
  66. package/lib/memory-prompt-context.d.ts.map +1 -0
  67. package/lib/memory-prompt-context.js +138 -0
  68. package/lib/memory-prompt-context.js.map +1 -0
  69. package/lib/memory-reflection.d.ts +8 -3
  70. package/lib/memory-reflection.d.ts.map +1 -1
  71. package/lib/memory-reflection.js +80 -19
  72. package/lib/memory-reflection.js.map +1 -1
  73. package/lib/memory-store.d.ts +13 -1
  74. package/lib/memory-store.d.ts.map +1 -1
  75. package/lib/memory-store.js +182 -8
  76. package/lib/memory-store.js.map +1 -1
  77. package/lib/profile-domain.d.ts +7 -0
  78. package/lib/profile-domain.d.ts.map +1 -0
  79. package/lib/profile-domain.js +56 -0
  80. package/lib/profile-domain.js.map +1 -0
  81. package/lib/store.d.ts.map +1 -1
  82. package/lib/store.js +39 -3
  83. package/lib/store.js.map +1 -1
  84. package/lib/time-format.d.ts +2 -0
  85. package/lib/time-format.d.ts.map +1 -0
  86. package/lib/time-format.js +20 -0
  87. package/lib/time-format.js.map +1 -0
  88. package/package.json +3 -1
@@ -0,0 +1,132 @@
1
+ export type ConcernOrigin = 'explicit' | 'implicit';
2
+ export type ConcernState = 'active' | 'watching' | 'snoozed' | 'resolved' | 'archived';
3
+ export type ConcernWatchKind = 'auto' | 'knowledge' | 'workspace' | 'web';
4
+ export type ObservationDecision = 'drop' | 'remember' | 'defer' | 'feed' | 'notify';
5
+ export type NotificationRuleEffect = 'auto' | 'notify' | 'suppress';
6
+ export type ConcernResourceKind = 'file' | 'knowledge';
7
+ export interface ConcernResource {
8
+ kind: ConcernResourceKind;
9
+ locator: string;
10
+ label: string;
11
+ }
12
+ export interface PartnerConcern {
13
+ id: string;
14
+ companionId: string;
15
+ scopeId: string;
16
+ subject: string;
17
+ reason: string;
18
+ origin: ConcernOrigin;
19
+ state: ConcernState;
20
+ priority: number;
21
+ confidence: number;
22
+ score: number;
23
+ watchKind: ConcernWatchKind;
24
+ watchQuery: string;
25
+ resources: ConcernResource[];
26
+ createdAt: number;
27
+ updatedAt: number;
28
+ lastActivityAt: number;
29
+ nextCheckAt: number;
30
+ lastCheckedAt?: number;
31
+ lastMentionedAt?: number;
32
+ resolvedAt?: number;
33
+ }
34
+ export interface ConcernCandidate {
35
+ subject: string;
36
+ reason: string;
37
+ operation: 'upsert' | 'resolve' | 'dismiss';
38
+ priority: number;
39
+ confidence: number;
40
+ watchKind: ConcernWatchKind;
41
+ watchQuery: string;
42
+ resources?: ConcernResource[];
43
+ }
44
+ export declare const IMPLICIT_CONCERN_MIN_PRIORITY = 0.55;
45
+ export declare const IMPLICIT_CONCERN_MIN_CONFIDENCE = 0.72;
46
+ export declare const IMPLICIT_CONCERN_MIN_SCORE = 0.64;
47
+ export declare const MAX_IMPLICIT_CONCERNS_PER_BATCH = 2;
48
+ /**
49
+ * Deterministic admission gate shared by reflection and AI tool suggestions.
50
+ * The model proposes; this policy decides whether an implicit concern may be
51
+ * persisted. Lifecycle operations remain available so stale concerns can be
52
+ * closed even when a later model response has lower confidence.
53
+ */
54
+ export declare function implicitConcernRejection(candidate: ConcernCandidate): string | undefined;
55
+ export interface ConcernObservationCandidate {
56
+ concernId: string;
57
+ changed: boolean;
58
+ event: string;
59
+ evidence: string;
60
+ source: string;
61
+ relevance: number;
62
+ confidence: number;
63
+ actionability: number;
64
+ nextCheckInMinutes?: number;
65
+ notificationRuleEffect?: NotificationRuleEffect;
66
+ notificationRuleReason?: string;
67
+ }
68
+ export interface ConcernObservation {
69
+ id: string;
70
+ concernId: string;
71
+ companionId: string;
72
+ scopeId: string;
73
+ fingerprint: string;
74
+ event: string;
75
+ evidence: string;
76
+ source: string;
77
+ novelty: number;
78
+ relevance: number;
79
+ confidence: number;
80
+ actionability: number;
81
+ interruptScore: number;
82
+ decision: ObservationDecision;
83
+ notificationRuleEffect: NotificationRuleEffect;
84
+ notificationRuleReason: string;
85
+ decisionReason: string;
86
+ createdAt: number;
87
+ mentionedAt?: number;
88
+ }
89
+ export interface ConcernActivity {
90
+ concerns: PartnerConcern[];
91
+ observations: ConcernObservation[];
92
+ }
93
+ export type ConcernLifecycleAction = 'ignore' | 'resolve';
94
+ export interface ConcernLifecycleRequest {
95
+ action: ConcernLifecycleAction;
96
+ target: string;
97
+ }
98
+ export interface AppliedConcernLifecycleDirective extends ConcernLifecycleRequest {
99
+ concernId: string;
100
+ subject: string;
101
+ }
102
+ export declare function concernInterval(priority: number, origin: ConcernOrigin): number;
103
+ export declare const MIN_CONCERN_CHECK_MINUTES = 30;
104
+ export declare const MAX_CONCERN_CHECK_MINUTES: number;
105
+ export declare function boundedConcernCheckMinutes(value: unknown): number | undefined;
106
+ export declare function concernDecay(score: number, lastActivityAt: number, now: number, origin: ConcernOrigin): number;
107
+ export declare function interruptDecision(input: {
108
+ priority: number;
109
+ concernConfidence: number;
110
+ observationConfidence: number;
111
+ relevance: number;
112
+ novelty: number;
113
+ actionability: number;
114
+ recentlyMentioned: boolean;
115
+ firstObservation: boolean;
116
+ userRecentlyActive?: boolean;
117
+ notificationRuleEffect?: NotificationRuleEffect;
118
+ }): {
119
+ score: number;
120
+ decision: ObservationDecision;
121
+ reason: string;
122
+ };
123
+ export declare function normalizeConcernSubject(value: string): string;
124
+ /** Parse only explicit, named lifecycle commands; ambiguous references remain model-assisted. */
125
+ export declare function concernLifecycleRequest(value: string): ConcernLifecycleRequest | undefined;
126
+ /** Conservative fuzzy score for a named command and an existing concern subject. */
127
+ export declare function concernSubjectSimilarity(leftValue: string, rightValue: string): number;
128
+ export declare function selectConcernLifecycleTarget(request: ConcernLifecycleRequest, concerns: readonly PartnerConcern[]): PartnerConcern | undefined;
129
+ export declare function focusedConcernQuery(value: string): string;
130
+ export declare function extractConcernResources(value: string): ConcernResource[];
131
+ export declare function clamp(value: number): number;
132
+ //# sourceMappingURL=concern-domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-domain.d.ts","sourceRoot":"","sources":["../src/concern-domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ export const IMPLICIT_CONCERN_MIN_PRIORITY = .55;
2
+ export const IMPLICIT_CONCERN_MIN_CONFIDENCE = .72;
3
+ export const IMPLICIT_CONCERN_MIN_SCORE = .64;
4
+ export const MAX_IMPLICIT_CONCERNS_PER_BATCH = 2;
5
+ /**
6
+ * Deterministic admission gate shared by reflection and AI tool suggestions.
7
+ * The model proposes; this policy decides whether an implicit concern may be
8
+ * persisted. Lifecycle operations remain available so stale concerns can be
9
+ * closed even when a later model response has lower confidence.
10
+ */
11
+ export function implicitConcernRejection(candidate) {
12
+ if (candidate.operation !== 'upsert')
13
+ return undefined;
14
+ const subjectLength = [...normalizeConcernSubject(candidate.subject)].length;
15
+ if (subjectLength < 4)
16
+ return '关注主题过于宽泛';
17
+ if ([...candidate.reason.trim()].length < 4)
18
+ return '缺少继续关注的具体原因';
19
+ if ([...candidate.watchQuery.trim()].length < 2)
20
+ return '缺少可执行的观察目标';
21
+ const priority = clamp(candidate.priority);
22
+ const confidence = clamp(candidate.confidence);
23
+ if (priority < IMPLICIT_CONCERN_MIN_PRIORITY)
24
+ return '优先级不足';
25
+ if (confidence < IMPLICIT_CONCERN_MIN_CONFIDENCE)
26
+ return '证据置信度不足';
27
+ if (priority * .55 + confidence * .45 < IMPLICIT_CONCERN_MIN_SCORE)
28
+ return '综合关注分数不足';
29
+ return undefined;
30
+ }
31
+ export function concernInterval(priority, origin) {
32
+ const hours = priority >= .85 ? 3 : priority >= .65 ? 8 : priority >= .4 ? 24 : 72;
33
+ return hours * 3_600_000 * (origin === 'explicit' ? .75 : 1);
34
+ }
35
+ export const MIN_CONCERN_CHECK_MINUTES = 30;
36
+ export const MAX_CONCERN_CHECK_MINUTES = 30 * 24 * 60;
37
+ export function boundedConcernCheckMinutes(value) {
38
+ if (typeof value !== 'number' || !Number.isFinite(value))
39
+ return undefined;
40
+ return Math.min(MAX_CONCERN_CHECK_MINUTES, Math.max(MIN_CONCERN_CHECK_MINUTES, Math.round(value)));
41
+ }
42
+ export function concernDecay(score, lastActivityAt, now, origin) {
43
+ if (origin === 'explicit')
44
+ return score;
45
+ const inactiveDays = Math.max(0, (now - lastActivityAt) / 86_400_000);
46
+ return clamp(score * Math.exp(-inactiveDays / 30));
47
+ }
48
+ export function interruptDecision(input) {
49
+ if (input.observationConfidence < .45 || input.relevance < .35) {
50
+ return { score: 0, decision: 'drop', reason: '证据置信度或相关性不足' };
51
+ }
52
+ let score = input.priority * .24
53
+ + input.concernConfidence * .13
54
+ + input.observationConfidence * .17
55
+ + input.relevance * .2
56
+ + input.novelty * .12
57
+ + input.actionability * .14;
58
+ if (input.recentlyMentioned)
59
+ score -= .24;
60
+ if (input.firstObservation)
61
+ score -= .18;
62
+ if (input.userRecentlyActive)
63
+ score -= .12;
64
+ score = clamp(score);
65
+ if (input.notificationRuleEffect === 'notify' && input.observationConfidence >= .75 && input.relevance >= .75) {
66
+ return { score: Math.max(.82, score), decision: 'notify', reason: '命中关联知识文档中的明确提醒条件' };
67
+ }
68
+ if (input.notificationRuleEffect === 'suppress' && score >= .82) {
69
+ return { score: .819, decision: 'feed', reason: '关联知识文档明确要求暂不主动提醒' };
70
+ }
71
+ const decision = score >= .82 ? 'notify' : score >= .64 ? 'feed' : score >= .42 ? 'defer' : 'remember';
72
+ return {
73
+ score,
74
+ decision,
75
+ reason: decision === 'notify' ? '打扰分数达到主动提醒阈值'
76
+ : decision === 'feed' ? '变化进入伙伴动态,不主动打扰'
77
+ : decision === 'defer' ? '变化与未来对话相关时顺带提及'
78
+ : '变化仅静默记录',
79
+ };
80
+ }
81
+ export function normalizeConcernSubject(value) {
82
+ return value.toLocaleLowerCase().replace(/[\s\p{P}\p{S}]+/gu, '');
83
+ }
84
+ /** Parse only explicit, named lifecycle commands; ambiguous references remain model-assisted. */
85
+ export function concernLifecycleRequest(value) {
86
+ const text = value.normalize('NFKC').replace(/\s+/gu, ' ').trim();
87
+ if (!text || /[??]\s*$/u.test(text) || /^(?:为什么|为何|怎么|怎会|是不是|是否|难道)/u.test(text))
88
+ return undefined;
89
+ const ignoreVerb = '(?:不|不要|不用|无需|别|取消|停止)(?:再|继续)?(?:关注|留意|盯着|盯|跟进|惦记|记着|巡检|巡查|观察|检查|管)';
90
+ const leading = text.match(new RegExp(`^(?:(?:请|麻烦)[,,:: ]*)?(?:(?:我|你|伙伴)(?:现在|以后|也)?[,,:: ]*)?(?:让(?:伙伴|你)[,,:: ]*)?${ignoreVerb}(?:一下)?[,,:: ]*([^,。!?;;\\n]+)`, 'u'));
91
+ const trailing = text.match(new RegExp(`^([^,。!?;;\\n]+?)[,,:: ]*(?:我|让(?:伙伴|你))?[,,:: ]*${ignoreVerb}(?:了|啦|吧)?$`, 'u'));
92
+ const ignored = cleanLifecycleTarget(leading?.[1] ?? trailing?.[1] ?? '');
93
+ if (ignored)
94
+ return { action: 'ignore', target: ignored };
95
+ const resolved = text.match(/^([^,。!?;;\n]+?)[,,:: ]*(?:已经|已)?(?:解决|完成|搞定|闭环)(?:了|啦|吧)?$/u);
96
+ const resolvedTarget = cleanLifecycleTarget(resolved?.[1] ?? '');
97
+ return resolvedTarget ? { action: 'resolve', target: resolvedTarget } : undefined;
98
+ }
99
+ /** Conservative fuzzy score for a named command and an existing concern subject. */
100
+ export function concernSubjectSimilarity(leftValue, rightValue) {
101
+ const left = normalizeConcernSubject(leftValue.normalize('NFKC'));
102
+ const right = normalizeConcernSubject(rightValue.normalize('NFKC'));
103
+ if (!left || !right)
104
+ return 0;
105
+ if (left === right)
106
+ return 1;
107
+ const longest = Math.max(left.length, right.length);
108
+ const containment = left.includes(right) || right.includes(left) ? Math.min(left.length, right.length) / longest : 0;
109
+ const subsequence = longestCommonSubsequence(left, right) / longest;
110
+ const pairs = bigramDice(left, right);
111
+ return Math.max(containment, subsequence, pairs);
112
+ }
113
+ export function selectConcernLifecycleTarget(request, concerns) {
114
+ const ranked = concerns
115
+ .filter(item => item.state !== 'archived')
116
+ .map(item => ({ item, score: concernSubjectSimilarity(request.target, item.subject) }))
117
+ .filter(item => item.score >= .74)
118
+ .sort((left, right) => right.score - left.score || right.item.updatedAt - left.item.updatedAt);
119
+ const first = ranked[0];
120
+ if (first === undefined)
121
+ return undefined;
122
+ const second = ranked[1];
123
+ if (first.score < 1 && second !== undefined && first.score - second.score < .1)
124
+ return undefined;
125
+ return first.item;
126
+ }
127
+ export function focusedConcernQuery(value) {
128
+ return value.normalize('NFKC')
129
+ .replace(/(?:请|麻烦|帮我|替我|让伙伴|让你|关注|留意|盯着|跟进|惦记|记着|帮忙看看)/gu, ' ')
130
+ .replace(/[\/·||]+/gu, ' ')
131
+ .replace(/[,。!?、;;,.!?::()[\]{}]+/gu, ' ')
132
+ .replace(/\s+/gu, ' ')
133
+ .trim();
134
+ }
135
+ export function extractConcernResources(value) {
136
+ const resources = [];
137
+ const knowledgeRanges = [];
138
+ for (const match of value.matchAll(/@知识库\[([^\]/]{1,100})(?:\/([^\]]{1,240}))?\]/gu)) {
139
+ const token = match[0];
140
+ const base = match[1]?.trim();
141
+ if (!token || !base || match.index === undefined)
142
+ continue;
143
+ const document = match[2]?.trim();
144
+ knowledgeRanges.push([match.index, match.index + token.length]);
145
+ resources.push({ kind: 'knowledge', locator: document ? `${base}/${document}` : base, label: document ? `${base} · ${document}` : base });
146
+ }
147
+ for (const match of value.matchAll(/(?:^|\s)@(?:"([^"]+)"|([^\s]+))/gu)) {
148
+ const raw = (match[1] ?? match[2] ?? '').trim().replace(/[,。!?、;;,.!?]+$/u, '');
149
+ const at = (match.index ?? 0) + (match[0]?.indexOf('@') ?? 0);
150
+ if (!raw || raw.startsWith('知识库[') || knowledgeRanges.some(([start, end]) => at >= start && at < end))
151
+ continue;
152
+ const normalized = raw.replaceAll('\\', '/').replace(/^\.\//, '');
153
+ if (!normalized || normalized.startsWith('/') || normalized.split('/').includes('..') || /(?:^|\/)(?:memory|concerns)(?:\/|$)/iu.test(normalized))
154
+ continue;
155
+ resources.push({ kind: 'file', locator: normalized.slice(0, 500), label: normalized.slice(0, 240) });
156
+ }
157
+ const seen = new Set();
158
+ return resources.filter(item => {
159
+ const key = `${item.kind}\u0000${item.locator.toLocaleLowerCase('zh-CN')}`;
160
+ if (seen.has(key))
161
+ return false;
162
+ seen.add(key);
163
+ return true;
164
+ }).slice(0, 8);
165
+ }
166
+ export function clamp(value) {
167
+ return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : .5;
168
+ }
169
+ function cleanLifecycleTarget(value) {
170
+ const target = value
171
+ .replace(/^[“”"'「」『』\s]+|[“”"'「」『』\s]+$/gu, '')
172
+ .replace(/^(?:关于|对于|对|这个|这件事|那个)[,,:: ]*/u, '')
173
+ .replace(/[,,:: ]*(?:了|啦|吧|就行|即可)$/u, '')
174
+ .trim();
175
+ return /^(?:这个|这件事|那个|它|这些|那件事)$/u.test(target) || normalizeConcernSubject(target).length < 2 ? '' : target.slice(0, 300);
176
+ }
177
+ function longestCommonSubsequence(left, right) {
178
+ const previous = new Uint16Array(right.length + 1);
179
+ const current = new Uint16Array(right.length + 1);
180
+ for (const leftCharacter of left) {
181
+ current.fill(0);
182
+ let column = 1;
183
+ for (const rightCharacter of right) {
184
+ current[column] = leftCharacter === rightCharacter
185
+ ? (previous[column - 1] ?? 0) + 1
186
+ : Math.max(previous[column] ?? 0, current[column - 1] ?? 0);
187
+ column += 1;
188
+ }
189
+ previous.set(current);
190
+ }
191
+ return previous[right.length] ?? 0;
192
+ }
193
+ function bigramDice(left, right) {
194
+ if (left.length < 2 || right.length < 2)
195
+ return 0;
196
+ const available = new Map();
197
+ for (let index = 0; index < left.length - 1; index += 1) {
198
+ const pair = left.slice(index, index + 2);
199
+ available.set(pair, (available.get(pair) ?? 0) + 1);
200
+ }
201
+ let matches = 0;
202
+ for (let index = 0; index < right.length - 1; index += 1) {
203
+ const pair = right.slice(index, index + 2);
204
+ const count = available.get(pair) ?? 0;
205
+ if (count <= 0)
206
+ continue;
207
+ matches += 1;
208
+ available.set(pair, count - 1);
209
+ }
210
+ return (2 * matches) / (left.length + right.length - 2);
211
+ }
212
+ //# sourceMappingURL=concern-domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-domain.js","sourceRoot":"","sources":["../src/concern-domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SessionEvent } from '@deepseek-ai/dsh-session';
2
+ import type { PartnerConcern } from './concern-domain.js';
3
+ export declare const CONCERN_CREATED_NOTICE = "\u4F19\u4F34\u81EA\u52A8\u65B0\u589E\u5173\u6CE8";
4
+ export declare function renderConcernCreatedNotice(concerns: readonly PartnerConcern[]): string;
5
+ export declare function concernCreatedNoticeFromEvent(event: SessionEvent): string | undefined;
6
+ //# sourceMappingURL=concern-notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-notification.d.ts","sourceRoot":"","sources":["../src/concern-notification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,eAAO,MAAM,sBAAsB,qDAAa,CAAA;AAEhD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAYtF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CASrF"}
@@ -0,0 +1,27 @@
1
+ export const CONCERN_CREATED_NOTICE = '伙伴自动新增关注';
2
+ export function renderConcernCreatedNotice(concerns) {
3
+ const lines = concerns.flatMap((concern, index) => [
4
+ `${index + 1}. ${concern.subject}`,
5
+ ...(concern.reason ? [` ${concern.reason}`] : []),
6
+ ]);
7
+ return [
8
+ `伙伴刚刚自动新增了 ${concerns.length} 条关注:`,
9
+ '',
10
+ ...lines,
11
+ '',
12
+ '可以在「伙伴 > 在意的事」中查看;不需要时选择「别管这个」。',
13
+ ].join('\n');
14
+ }
15
+ export function concernCreatedNoticeFromEvent(event) {
16
+ if (event.type !== 'user/message')
17
+ return undefined;
18
+ const source = event.data.source;
19
+ if (source.kind !== 'plugin' || source.plugin !== '@lemoncat7/dsh-partner'
20
+ || source.form !== 'notice' || source.summary !== CONCERN_CREATED_NOTICE)
21
+ return undefined;
22
+ const value = event.data.content
23
+ .filter((block) => block.type === 'text')
24
+ .map(block => block.text.trim()).filter(Boolean).join('\n');
25
+ return value || undefined;
26
+ }
27
+ //# sourceMappingURL=concern-notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-notification.js","sourceRoot":"","sources":["../src/concern-notification.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAA;AAEhD,MAAM,UAAU,0BAA0B,CAAC,QAAmC;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,GAAG,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE;QAClC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC,CAAA;IACF,OAAO;QACL,aAAa,QAAQ,CAAC,MAAM,OAAO;QACnC,EAAE;QACF,GAAG,KAAK;QACR,EAAE;QACF,iCAAiC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAmB;IAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,SAAS,CAAA;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA;IAChC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,wBAAwB;WACrE,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,sBAAsB;QAAE,OAAO,SAAS,CAAA;IAC5F,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO;SAC7B,MAAM,CAAC,CAAC,KAAK,EAA2C,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACjF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7D,OAAO,KAAK,IAAI,SAAS,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface ConcernSource {
2
+ kind: 'file' | 'knowledge';
3
+ label: string;
4
+ detail: string;
5
+ token: string;
6
+ }
7
+ /** Bounded, symlink-free discovery for files that a partner can safely reference. */
8
+ export declare function listConcernFileSources(root: string, query?: string, limit?: number): Promise<ConcernSource[]>;
9
+ export declare function fileToken(locator: string): string;
10
+ //# sourceMappingURL=concern-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-sources.d.ts","sourceRoot":"","sources":["../src/concern-sources.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AASD,qFAAqF;AACrF,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA8C3G;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,81 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import { join, relative, sep } from 'node:path';
3
+ const EXCLUDED_DIRECTORIES = new Set([
4
+ '.cache', '.git', '.svn', 'concerns', 'memory', 'node_modules',
5
+ ]);
6
+ const MAX_DIRECTORY_COUNT = 120;
7
+ const MAX_ENTRY_COUNT = 1_500;
8
+ const MAX_DEPTH = 6;
9
+ /** Bounded, symlink-free discovery for files that a partner can safely reference. */
10
+ export async function listConcernFileSources(root, query = '', limit = 24) {
11
+ const boundedLimit = Math.max(1, Math.min(Math.trunc(limit), 40));
12
+ const normalizedQuery = fold(query);
13
+ const queue = [{ path: root, depth: 0 }];
14
+ const matches = [];
15
+ let directories = 0;
16
+ let entries = 0;
17
+ while (queue.length > 0 && directories < MAX_DIRECTORY_COUNT && entries < MAX_ENTRY_COUNT) {
18
+ const current = queue.shift();
19
+ if (current === undefined)
20
+ break;
21
+ directories += 1;
22
+ let children;
23
+ try {
24
+ children = await readdir(current.path, { withFileTypes: true });
25
+ }
26
+ catch {
27
+ continue;
28
+ }
29
+ children.sort((left, right) => left.name.localeCompare(right.name, 'zh-CN'));
30
+ for (const child of children) {
31
+ entries += 1;
32
+ if (entries > MAX_ENTRY_COUNT)
33
+ break;
34
+ if (child.name.startsWith('.') || child.isSymbolicLink())
35
+ continue;
36
+ const childPath = join(current.path, child.name);
37
+ if (child.isDirectory()) {
38
+ if (current.depth < MAX_DEPTH && !EXCLUDED_DIRECTORIES.has(child.name.toLocaleLowerCase('en-US'))) {
39
+ queue.push({ path: childPath, depth: current.depth + 1 });
40
+ }
41
+ continue;
42
+ }
43
+ if (!child.isFile())
44
+ continue;
45
+ const locator = relative(root, childPath).split(sep).join('/');
46
+ if (locator.includes('"'))
47
+ continue;
48
+ const score = matchScore(locator, normalizedQuery);
49
+ if (score < 0)
50
+ continue;
51
+ matches.push({
52
+ kind: 'file',
53
+ label: locator,
54
+ detail: locator.includes('/') ? `当前会话文件 · ${locator.slice(0, locator.lastIndexOf('/'))}` : '当前会话文件',
55
+ token: fileToken(locator),
56
+ score,
57
+ });
58
+ }
59
+ }
60
+ return matches
61
+ .sort((left, right) => right.score - left.score || left.label.localeCompare(right.label, 'zh-CN'))
62
+ .slice(0, boundedLimit)
63
+ .map(({ score: _score, ...source }) => source);
64
+ }
65
+ export function fileToken(locator) {
66
+ return /\s/u.test(locator) ? `@"${locator.replaceAll('"', '\\"')}"` : `@${locator}`;
67
+ }
68
+ function matchScore(value, query) {
69
+ if (!query)
70
+ return 0;
71
+ const folded = fold(value);
72
+ const index = folded.indexOf(query);
73
+ if (index < 0)
74
+ return -1;
75
+ const name = folded.slice(folded.lastIndexOf('/') + 1);
76
+ return (name === query ? 80 : name.startsWith(query) ? 60 : name.includes(query) ? 40 : 20) - index * .01;
77
+ }
78
+ function fold(value) {
79
+ return value.trim().replace(/^@(?:"|知识库\[)?/u, '').toLocaleLowerCase('zh-CN');
80
+ }
81
+ //# sourceMappingURL=concern-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-sources.js","sourceRoot":"","sources":["../src/concern-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { type ConcernActivity, type ConcernCandidate, type ConcernObservation, type ConcernObservationCandidate, type AppliedConcernLifecycleDirective, type ConcernOrigin, type PartnerConcern } from './concern-domain.js';
2
+ export interface LegacyConcernSeed {
3
+ scopeId: string;
4
+ subject: string;
5
+ reason: string;
6
+ confidence: number;
7
+ origin: ConcernOrigin;
8
+ }
9
+ export interface ConcernDueOptions {
10
+ now?: number;
11
+ limit?: number;
12
+ includeFuture?: boolean;
13
+ concernId?: string;
14
+ }
15
+ export type ConcernCandidateSource = 'reflection' | 'daily_review' | 'tool' | 'ui';
16
+ export type ConcernAuditDecision = 'created' | 'updated' | 'resolved' | 'dismissed' | 'rejected' | 'ignored';
17
+ export interface ConcernApplyOptions {
18
+ source?: ConcernCandidateSource;
19
+ sessionId?: string;
20
+ evidence?: string;
21
+ maxImplicitCreates?: number;
22
+ }
23
+ export interface ConcernApplyEntry {
24
+ subject: string;
25
+ decision: ConcernAuditDecision;
26
+ reason: string;
27
+ concern?: PartnerConcern;
28
+ }
29
+ export interface ConcernApplyResult {
30
+ created: PartnerConcern[];
31
+ entries: ConcernApplyEntry[];
32
+ }
33
+ export interface PendingConcernNotice {
34
+ auditIds: string[];
35
+ concerns: PartnerConcern[];
36
+ }
37
+ export declare class PartnerConcernStore {
38
+ private readonly root;
39
+ private readonly writes;
40
+ constructor(root: string);
41
+ migrateLegacy(companionId: string, seeds: LegacyConcernSeed[]): Promise<boolean>;
42
+ applyCandidates(companionId: string, scopeId: string, candidates: ConcernCandidate[], origin: ConcernOrigin, at?: number, options?: ConcernApplyOptions): Promise<PartnerConcern[]>;
43
+ ingestCandidates(companionId: string, scopeId: string, candidates: ConcernCandidate[], origin: ConcernOrigin, at?: number, options?: ConcernApplyOptions): Promise<ConcernApplyResult>;
44
+ createExplicit(companionId: string, scopeId: string, subject: string, reason?: string): Promise<PartnerConcern>;
45
+ applyUserDirective(companionId: string, scopeId: string, value: string, now?: number): Promise<AppliedConcernLifecycleDirective | undefined>;
46
+ list(companionId: string, scopeId?: string, includeArchived?: boolean, limit?: number): Promise<PartnerConcern[]>;
47
+ due(companionId: string, scopeId: string, options?: ConcernDueOptions): Promise<PartnerConcern[]>;
48
+ recordObservations(concerns: PartnerConcern[], candidates: ConcernObservationCandidate[], now?: number, userRecentlyActive?: boolean): Promise<{
49
+ observations: ConcernObservation[];
50
+ notifications: ConcernObservation[];
51
+ }>;
52
+ activity(companionId: string, limit?: number): Promise<ConcernActivity>;
53
+ pendingToolCreationNotices(companionId: string, scopeId: string, sessionId: string, limit?: number): Promise<PendingConcernNotice>;
54
+ markCreationAuditsNotified(companionId: string, auditIds: string[], at?: number): Promise<void>;
55
+ deferred(companionId: string, scopeId: string, query: string, limit?: number): Promise<ConcernObservation[]>;
56
+ pendingNotifications(companionId: string, scopeId: string, limit?: number): Promise<ConcernObservation[]>;
57
+ markMentioned(companionId: string, observationIds: string[], now?: number): Promise<void>;
58
+ act(companionId: string, concernId: string, action: 'watch' | 'ignore' | 'prioritize' | 'resolve', now?: number): Promise<void>;
59
+ clear(companionId: string): Promise<void>;
60
+ private upsert;
61
+ private existing;
62
+ private audit;
63
+ private open;
64
+ private path;
65
+ private serial;
66
+ private serialValue;
67
+ }
68
+ //# sourceMappingURL=concern-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-store.d.ts","sourceRoot":"","sources":["../src/concern-store.ts"],"names":[],"mappings":"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"}