@dsh-enhanced/assistant-delivery 0.1.6 → 0.1.12

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 (59) hide show
  1. package/README.md +106 -7
  2. package/cordis.patch.yml +1 -0
  3. package/lib/agent-runtime.d.ts +23 -2
  4. package/lib/agent-runtime.d.ts.map +1 -1
  5. package/lib/agent-runtime.js +317 -2
  6. package/lib/agent-runtime.js.map +1 -1
  7. package/lib/canonical.d.ts +11 -1
  8. package/lib/canonical.d.ts.map +1 -1
  9. package/lib/canonical.js +107 -0
  10. package/lib/canonical.js.map +1 -1
  11. package/lib/coordinator.d.ts +3 -1
  12. package/lib/coordinator.d.ts.map +1 -1
  13. package/lib/coordinator.js +49 -21
  14. package/lib/coordinator.js.map +1 -1
  15. package/lib/feedback-command.d.ts +60 -0
  16. package/lib/feedback-command.d.ts.map +1 -0
  17. package/lib/feedback-command.js +338 -0
  18. package/lib/feedback-command.js.map +1 -0
  19. package/lib/index.d.ts +4 -3
  20. package/lib/index.d.ts.map +1 -1
  21. package/lib/index.js +4 -3
  22. package/lib/index.js.map +1 -1
  23. package/lib/learning-command.d.ts +40 -0
  24. package/lib/learning-command.d.ts.map +1 -0
  25. package/lib/learning-command.js +57 -0
  26. package/lib/learning-command.js.map +1 -0
  27. package/lib/service.d.ts +149 -6
  28. package/lib/service.d.ts.map +1 -1
  29. package/lib/service.js +1945 -34
  30. package/lib/service.js.map +1 -1
  31. package/lib/session-commands.d.ts +14 -0
  32. package/lib/session-commands.d.ts.map +1 -1
  33. package/lib/session-commands.js +30 -0
  34. package/lib/session-commands.js.map +1 -1
  35. package/lib/sqlite.d.ts +1 -1
  36. package/lib/sqlite.d.ts.map +1 -1
  37. package/lib/sqlite.js +648 -20
  38. package/lib/sqlite.js.map +1 -1
  39. package/lib/store.d.ts +375 -3
  40. package/lib/store.d.ts.map +1 -1
  41. package/lib/store.js +2956 -74
  42. package/lib/store.js.map +1 -1
  43. package/lib/types.d.ts +407 -0
  44. package/lib/types.d.ts.map +1 -1
  45. package/lib/types.js +9 -1
  46. package/lib/types.js.map +1 -1
  47. package/lib/version.d.ts +1 -1
  48. package/lib/version.d.ts.map +1 -1
  49. package/lib/version.js +1 -1
  50. package/lib/version.js.map +1 -1
  51. package/lib/workflow-auto-producer.d.ts +37 -0
  52. package/lib/workflow-auto-producer.d.ts.map +1 -0
  53. package/lib/workflow-auto-producer.js +58 -0
  54. package/lib/workflow-auto-producer.js.map +1 -0
  55. package/lib/workflow-command.d.ts +16 -0
  56. package/lib/workflow-command.d.ts.map +1 -0
  57. package/lib/workflow-command.js +52 -0
  58. package/lib/workflow-command.js.map +1 -0
  59. package/package.json +23 -3
@@ -0,0 +1,338 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { externalPrincipalId } from './canonical.js';
3
+ const responseFeedback = Object.freeze([
4
+ 'helpful',
5
+ 'not-helpful',
6
+ 'too-long',
7
+ 'too-short',
8
+ 'wrong-format',
9
+ 'wrong-action',
10
+ 'unwanted-reminder',
11
+ ]);
12
+ const objectiveFeedback = Object.freeze([
13
+ 'achieved',
14
+ 'partial',
15
+ 'not-achieved',
16
+ ]);
17
+ const typedPreferences = Object.freeze({
18
+ verbosity: Object.freeze({
19
+ preferenceKey: 'response.verbosity',
20
+ values: Object.freeze(['concise', 'balanced', 'detailed']),
21
+ }),
22
+ structure: Object.freeze({
23
+ preferenceKey: 'response.structure',
24
+ values: Object.freeze(['prose', 'bullets', 'mixed']),
25
+ }),
26
+ language: Object.freeze({
27
+ preferenceKey: 'response.language',
28
+ values: Object.freeze(['zh-CN', 'en']),
29
+ }),
30
+ explanation: Object.freeze({
31
+ preferenceKey: 'response.explanation_depth',
32
+ values: Object.freeze(['result-first', 'balanced', 'tutorial']),
33
+ }),
34
+ suggestions: Object.freeze({
35
+ preferenceKey: 'suggestion.frequency',
36
+ values: Object.freeze(['low', 'normal']),
37
+ }),
38
+ ranking: Object.freeze({
39
+ preferenceKey: 'recommendation.ranking',
40
+ values: Object.freeze(['recency', 'familiarity', 'evidence']),
41
+ }),
42
+ });
43
+ export const feedbackUsage = [
44
+ '反馈命令:',
45
+ '- 回复一条自动化或普通 Agent 任务结果,并发送 /feedback achieved|partial|not-achieved(记录该次任务结果)',
46
+ '- /feedback helpful|not-helpful|too-long|too-short|wrong-format|wrong-action|unwanted-reminder',
47
+ '- /feedback verbosity concise|balanced|detailed',
48
+ '- /feedback structure prose|bullets|mixed',
49
+ '- /feedback language zh-CN|en',
50
+ '- /feedback explanation result-first|balanced|tutorial',
51
+ '- /feedback suggestions low|normal',
52
+ '- /feedback ranking recency|familiarity|evidence',
53
+ '',
54
+ 'helpful 等只记录偏好,不代表任务成败。任务结果必须回复对应的任务结果消息。',
55
+ '反馈只作用于当前工作区与 preset;命令不接受附件,也不会进入模型。',
56
+ ].join('\n');
57
+ /** Parse a closed, typed grammar. No caller-provided text crosses this boundary. */
58
+ export function parseFeedbackCommand(rawInput) {
59
+ const normalized = rawInput.trim();
60
+ if (normalized === '')
61
+ return { kind: 'invalid' };
62
+ const tokens = normalized.split(/[\t\n\r ]+/u);
63
+ if (tokens.length === 1) {
64
+ const value = tokens[0];
65
+ if (objectiveFeedback.includes(value)) {
66
+ return { kind: 'objective', objectiveStatus: value };
67
+ }
68
+ if (!responseFeedback.includes(value))
69
+ return { kind: 'invalid' };
70
+ const selections = [
71
+ {
72
+ preferenceKey: 'feedback.response',
73
+ candidateValue: value,
74
+ interpretationTrust: 'typed-feedback',
75
+ },
76
+ ];
77
+ if (value === 'too-long') {
78
+ selections.push({
79
+ preferenceKey: 'response.verbosity', candidateValue: 'concise',
80
+ interpretationTrust: 'typed-feedback',
81
+ });
82
+ }
83
+ else if (value === 'too-short') {
84
+ selections.push({
85
+ preferenceKey: 'response.verbosity', candidateValue: 'detailed',
86
+ interpretationTrust: 'typed-feedback',
87
+ });
88
+ }
89
+ return { kind: 'signals', selections: Object.freeze(selections) };
90
+ }
91
+ if (tokens.length !== 2)
92
+ return { kind: 'invalid' };
93
+ const category = tokens[0];
94
+ const value = tokens[1];
95
+ if (!Object.hasOwn(typedPreferences, category))
96
+ return { kind: 'invalid' };
97
+ const entry = typedPreferences[category];
98
+ if (!entry.values.includes(value))
99
+ return { kind: 'invalid' };
100
+ return {
101
+ kind: 'signals',
102
+ selections: Object.freeze([{
103
+ preferenceKey: entry.preferenceKey,
104
+ candidateValue: value,
105
+ interpretationTrust: 'explicit-selection',
106
+ }]),
107
+ };
108
+ }
109
+ function feedbackSignalIdempotencyKey(binding, envelope, selection, principalLineage, admissionCursor) {
110
+ const identity = JSON.stringify([
111
+ binding.id,
112
+ binding.version,
113
+ binding.sessionId,
114
+ binding.generation,
115
+ principalLineage.principalRecordId,
116
+ principalLineage.principalVersion,
117
+ admissionCursor?.epoch ?? 'legacy-no-admission-epoch',
118
+ admissionCursor?.sequence ?? 'legacy-no-admission-sequence',
119
+ envelope.channel,
120
+ envelope.account,
121
+ envelope.eventId,
122
+ selection.preferenceKey,
123
+ selection.candidateValue,
124
+ selection.interpretationTrust ?? 'typed-feedback',
125
+ 'support',
126
+ ]);
127
+ const digest = createHash('sha256')
128
+ .update('assistant-delivery-feedback-v3\0')
129
+ .update(identity)
130
+ .digest('hex');
131
+ return `delivery-feedback-v3:${digest}`;
132
+ }
133
+ /** Build the exact Host-attested payload accepted by Preference Learning. */
134
+ export function feedbackSignalInput(binding, envelope, selection, authorization) {
135
+ return Object.freeze({
136
+ scope: Object.freeze({ workspace: binding.workspace, preset: binding.agentPreset }),
137
+ principalId: externalPrincipalId(binding.principal),
138
+ principalLineage: authorization.principalLineage,
139
+ ...(authorization.admissionCursor === undefined
140
+ ? {}
141
+ : { admissionCursor: authorization.admissionCursor }),
142
+ preferenceKey: selection.preferenceKey,
143
+ candidateValue: selection.candidateValue,
144
+ stance: 'support',
145
+ actorTrust: 'owner-authenticated',
146
+ interpretationTrust: selection.interpretationTrust ?? 'typed-feedback',
147
+ source: 'direct-owner-feedback',
148
+ occurredAt: authorization.occurredAt,
149
+ idempotencyKey: feedbackSignalIdempotencyKey(binding, envelope, selection, authorization.principalLineage, authorization.admissionCursor),
150
+ ...(authorization.exposureTarget === undefined
151
+ ? {}
152
+ : { exposureTarget: Object.freeze({ ...authorization.exposureTarget }) }),
153
+ });
154
+ }
155
+ /**
156
+ * Deterministic local language classifier. It never emits the source text and
157
+ * deliberately abstains for short or genuinely mixed messages.
158
+ */
159
+ export function observedResponseLanguage(text) {
160
+ const withoutCode = text
161
+ .replace(/```[\s\S]*?```/gu, ' ')
162
+ .replace(/`[^`]*`/gu, ' ')
163
+ .replace(/https?:\/\/\S+/gu, ' ');
164
+ const han = (withoutCode.match(/\p{Script=Han}/gu) ?? []).length;
165
+ const latin = (withoutCode.match(/\p{Script=Latin}/gu) ?? []).length;
166
+ if (han >= 4 && han * 2 >= latin)
167
+ return 'zh-CN';
168
+ if (latin >= 8 && latin >= han * 2)
169
+ return 'en';
170
+ return undefined;
171
+ }
172
+ const naturalPreferenceCorrections = new Map([
173
+ ['以后简短一点', { preferenceKey: 'response.verbosity', candidateValue: 'concise', interpretationTrust: 'explicit-selection' }],
174
+ ['今后简短一点', { preferenceKey: 'response.verbosity', candidateValue: 'concise', interpretationTrust: 'explicit-selection' }],
175
+ ['从现在起回答简短一点', { preferenceKey: 'response.verbosity', candidateValue: 'concise', interpretationTrust: 'explicit-selection' }],
176
+ ['以后回答详细一点', { preferenceKey: 'response.verbosity', candidateValue: 'detailed', interpretationTrust: 'explicit-selection' }],
177
+ ['今后回答详细一点', { preferenceKey: 'response.verbosity', candidateValue: 'detailed', interpretationTrust: 'explicit-selection' }],
178
+ ['以后用中文回答', { preferenceKey: 'response.language', candidateValue: 'zh-CN', interpretationTrust: 'explicit-selection' }],
179
+ ['今后用中文回答', { preferenceKey: 'response.language', candidateValue: 'zh-CN', interpretationTrust: 'explicit-selection' }],
180
+ ['从现在起用中文回答', { preferenceKey: 'response.language', candidateValue: 'zh-CN', interpretationTrust: 'explicit-selection' }],
181
+ ['以后用英文回答', { preferenceKey: 'response.language', candidateValue: 'en', interpretationTrust: 'explicit-selection' }],
182
+ ['今后用英文回答', { preferenceKey: 'response.language', candidateValue: 'en', interpretationTrust: 'explicit-selection' }],
183
+ ['从现在起用英文回答', { preferenceKey: 'response.language', candidateValue: 'en', interpretationTrust: 'explicit-selection' }],
184
+ ['以后少用列表', { preferenceKey: 'response.structure', candidateValue: 'prose', interpretationTrust: 'explicit-selection' }],
185
+ ['今后少用列表', { preferenceKey: 'response.structure', candidateValue: 'prose', interpretationTrust: 'explicit-selection' }],
186
+ ['以后多用列表', { preferenceKey: 'response.structure', candidateValue: 'bullets', interpretationTrust: 'explicit-selection' }],
187
+ ['今后多用列表', { preferenceKey: 'response.structure', candidateValue: 'bullets', interpretationTrust: 'explicit-selection' }],
188
+ ['from now on, be more concise', { preferenceKey: 'response.verbosity', candidateValue: 'concise', interpretationTrust: 'explicit-selection' }],
189
+ ['keep future answers concise', { preferenceKey: 'response.verbosity', candidateValue: 'concise', interpretationTrust: 'explicit-selection' }],
190
+ ['from now on, be more detailed', { preferenceKey: 'response.verbosity', candidateValue: 'detailed', interpretationTrust: 'explicit-selection' }],
191
+ ['always answer in chinese', { preferenceKey: 'response.language', candidateValue: 'zh-CN', interpretationTrust: 'explicit-selection' }],
192
+ ['from now on, respond in chinese', { preferenceKey: 'response.language', candidateValue: 'zh-CN', interpretationTrust: 'explicit-selection' }],
193
+ ['always answer in english', { preferenceKey: 'response.language', candidateValue: 'en', interpretationTrust: 'explicit-selection' }],
194
+ ['from now on, respond in english', { preferenceKey: 'response.language', candidateValue: 'en', interpretationTrust: 'explicit-selection' }],
195
+ ['always use fewer lists', { preferenceKey: 'response.structure', candidateValue: 'prose', interpretationTrust: 'explicit-selection' }],
196
+ ['always use more bullet points', { preferenceKey: 'response.structure', candidateValue: 'bullets', interpretationTrust: 'explicit-selection' }],
197
+ ]);
198
+ const oneShotPreferenceRequests = new Set([
199
+ '回答简短一点', '请简短回答', '回答详细一点', '请详细回答',
200
+ '请用中文回答', '用中文回答', '请用英文回答', '用英文回答', '少用列表', '多用列表',
201
+ 'be more concise', 'keep answers concise', 'be more detailed',
202
+ 'answer in chinese', 'respond in chinese', 'answer in english', 'respond in english',
203
+ 'please answer in chinese', 'please respond in chinese',
204
+ 'please answer in english', 'please respond in english',
205
+ 'please be concise', 'please be more concise', 'please be detailed', 'please be more detailed',
206
+ 'please use fewer lists', 'please use more bullet points',
207
+ 'use fewer lists', 'use more bullet points',
208
+ ]);
209
+ const oneTurnDirective = Object.freeze({ kind: 'one-turn-directive' });
210
+ const ambiguousDirective = Object.freeze({ kind: 'ambiguous-or-unsupported-directive' });
211
+ const ordinaryContent = Object.freeze({ kind: 'ordinary-content' });
212
+ function normalizedNaturalPreferenceText(text) {
213
+ if (Buffer.byteLength(text, 'utf8') > 96 || /[\r\n`"“”'‘’]/u.test(text))
214
+ return undefined;
215
+ return text.normalize('NFC').trim().replace(/[。!?.!?]+$/u, '').trim().toLowerCase();
216
+ }
217
+ function durableSelection(selection) {
218
+ return Object.freeze({
219
+ kind: 'durable-exact-selection',
220
+ selection: Object.freeze({ ...selection }),
221
+ });
222
+ }
223
+ function languageSelection(language) {
224
+ return {
225
+ preferenceKey: 'response.language',
226
+ candidateValue: language === '中文' || language === 'chinese' ? 'zh-CN' : 'en',
227
+ interpretationTrust: 'explicit-selection',
228
+ };
229
+ }
230
+ function exactDurablePreferenceSelection(normalized) {
231
+ const catalogSelection = naturalPreferenceCorrections.get(normalized);
232
+ if (catalogSelection !== undefined)
233
+ return catalogSelection;
234
+ const chineseLanguage = /^(?:(?:请|请你|麻烦|麻烦你)\s*)?(?:以后|今后|从现在起)(?:都|一直)?(?:请|请你)?\s*(?:用|使用)(中文|英文)(?:回答|回复)$/u.exec(normalized);
235
+ if (chineseLanguage?.[1] !== undefined)
236
+ return languageSelection(chineseLanguage[1]);
237
+ const englishLanguage = /^(?:please\s+)?(?:from now on,?\s*|in (?:the )?future,?\s*|always\s+)(?:please\s+)?(?:answer|respond|reply)(?: to me)? in (chinese|english)$/u.exec(normalized);
238
+ if (englishLanguage?.[1] !== undefined)
239
+ return languageSelection(englishLanguage[1]);
240
+ const chineseVerbosity = /^(?:(?:请|请你|麻烦|麻烦你)\s*)?(?:以后|今后|从现在起)(?:都|一直)?(?:请|请你)?\s*(?:(?:回答|回复)(?:得)?(简短|详细)(?:一点|些)?|(简短|详细)(?:一点|些)?(?:回答|回复))$/u.exec(normalized);
241
+ const chineseVerbosityValue = chineseVerbosity?.[1] ?? chineseVerbosity?.[2];
242
+ if (chineseVerbosityValue !== undefined) {
243
+ return {
244
+ preferenceKey: 'response.verbosity',
245
+ candidateValue: chineseVerbosityValue === '简短' ? 'concise' : 'detailed',
246
+ interpretationTrust: 'explicit-selection',
247
+ };
248
+ }
249
+ const englishVerbosity = /^(?:please\s+)?(?:(?:from now on|in (?:the )?future|always),?\s+(?:please\s+)?(?:be\s+)?(?:more\s+)?(concise|detailed)|keep future answers (concise|detailed))$/u.exec(normalized);
250
+ const englishVerbosityValue = englishVerbosity?.[1] ?? englishVerbosity?.[2];
251
+ if (englishVerbosityValue !== undefined) {
252
+ return {
253
+ preferenceKey: 'response.verbosity',
254
+ candidateValue: englishVerbosityValue === 'concise' ? 'concise' : 'detailed',
255
+ interpretationTrust: 'explicit-selection',
256
+ };
257
+ }
258
+ const chineseStructure = /^(?:(?:请|请你|麻烦|麻烦你)\s*)?(?:以后|今后|从现在起)(?:都|一直)?(?:请|请你)?\s*(少用|多用)(?:列表|项目符号)$/u.exec(normalized);
259
+ if (chineseStructure?.[1] !== undefined) {
260
+ return {
261
+ preferenceKey: 'response.structure',
262
+ candidateValue: chineseStructure[1] === '少用' ? 'prose' : 'bullets',
263
+ interpretationTrust: 'explicit-selection',
264
+ };
265
+ }
266
+ const englishStructure = /^(?:please\s+)?(?:from now on,?\s*|in (?:the )?future,?\s*|always\s+)(?:please\s+)?use (fewer lists|more bullet points)$/u.exec(normalized);
267
+ if (englishStructure?.[1] !== undefined) {
268
+ return {
269
+ preferenceKey: 'response.structure',
270
+ candidateValue: englishStructure[1] === 'fewer lists' ? 'prose' : 'bullets',
271
+ interpretationTrust: 'explicit-selection',
272
+ };
273
+ }
274
+ return undefined;
275
+ }
276
+ function isExactOneTurnPreferenceDirective(normalized) {
277
+ if (oneShotPreferenceRequests.has(normalized))
278
+ return true;
279
+ const chineseTemporary = /^(?:这次|本次|此次)(?:请|请你)?\s*(?:(?:用|使用)(?:中文|英文)(?:回答|回复)(?:(?:这个|本次|当前)(?:问题|回答|回复))?|(?:回答|回复)(?:得)?(?:简短|详细)(?:一点|些)?|(?:简短|详细)(?:一点|些)?(?:回答|回复)|少用(?:列表|项目符号)|多用(?:列表|项目符号))$/u;
280
+ const chineseDirective = /^(?:(?:请|请你|麻烦|麻烦你)\s*)?(?:(?:用|使用)(?:中文|英文)(?:回答|回复)(?:(?:这个|本次|当前)(?:问题|回答|回复)|本题|这道题)?|(?:回答|回复)(?:这个问题|本题|这道题)?(?:得)?(?:简短|详细)(?:一点|些)?|(?:简短|详细)(?:一点|些)?(?:回答|回复)|少用(?:列表|项目符号)|多用(?:列表|项目符号))$/u;
281
+ const englishTemporary = /^(?:this time,?\s*|for this (?:answer|response|question),?\s*)(?:please\s+)?(?:(?:answer|respond|reply)(?: to me)? in (?:chinese|english)|answer (?:this|this question|this response) in (?:chinese|english)|(?:respond|reply) to (?:this|this question|this response) in (?:chinese|english)|be (?:more )?(?:concise|detailed)|use (?:fewer lists|more bullet points))$/u;
282
+ const englishDirective = /^(?:(?:please|(?:could|would|can) you(?: please)?)\s+)?(?:(?:answer|respond|reply)(?: to me)? in (?:chinese|english)|answer (?:this|this question|this response) in (?:chinese|english)|(?:respond|reply) to (?:this|this question|this response) in (?:chinese|english)|be (?:more )?(?:concise|detailed)|use (?:fewer lists|more bullet points))$/u;
283
+ return chineseTemporary.test(normalized)
284
+ || chineseDirective.test(normalized)
285
+ || englishTemporary.test(normalized)
286
+ || englishDirective.test(normalized);
287
+ }
288
+ function containsPotentialPreferenceDirective(text) {
289
+ const normalized = text.normalize('NFC').toLowerCase();
290
+ const chineseLanguage = /(?:(?:用|使用|说|写).{0,8}(?:中文|英文)|(?:中文|英文).{0,12}(?:回答|回复|答复))/su;
291
+ const chineseUnsupportedLanguage = /(?:用|使用)[^,。!?\r\n]{1,16}(?:语|文)(?:回答|回复|答复)/su;
292
+ const chinesePresentation = /(?:(?:回答|回复|答复).{0,12}(?:简短|简洁|详细|列表|项目符号)|(?:简短|简洁|详细|列表|项目符号).{0,12}(?:回答|回复|答复))/su;
293
+ const chineseDirectStyle = /(?:(?:请|请你|麻烦|麻烦你|这次|本次|此次|以后|今后|从现在起).{0,16}(?:简短|简洁|详细)(?:一点|一些|些)?|(?:简短|简洁|详细)(?:一点|一些|些)?(?:回答|回复)|(?:少用|多用)(?:列表|项目符号))/su;
294
+ const chineseFutureStyle = /(?:以后|今后|从现在起).{0,32}(?:回答|回复|答复|语言|语气|风格|格式|中文|英文|简短|简洁|详细|列表|项目符号)/su;
295
+ const englishLanguage = /(?:(?:answer|respond|reply|write|speak).{0,32}\b(?:chinese|english)\b|\b(?:chinese|english)\b.{0,32}(?:answer|response|respond|reply))/su;
296
+ const englishUnsupportedLanguage = /(?:answer|respond|reply).{0,24}\bin\s+[a-z][a-z-]{2,20}\b/su;
297
+ const englishPresentation = /(?:(?:answer|response|respond|reply).{0,32}\b(?:concise|detailed|brief|list|lists|bullet|bullets|tone|style|format)\b|\b(?:concise|detailed|brief|lists?|bullets?|tone|style|format)\b.{0,32}(?:answer|response|respond|reply))/su;
298
+ const englishDirectStyle = /\b(?:be (?:more )?(?:concise|detailed)|use (?:fewer lists|more bullet points))\b/su;
299
+ const englishFutureStyle = /(?:from now on|in the future|future answers?|always).{0,48}(?:answer|response|respond|reply|language|tone|style|format|chinese|english|concise|detailed|lists?|bullets?)/su;
300
+ return chineseLanguage.test(normalized)
301
+ || chineseUnsupportedLanguage.test(normalized)
302
+ || chinesePresentation.test(normalized)
303
+ || chineseDirectStyle.test(normalized)
304
+ || chineseFutureStyle.test(normalized)
305
+ || englishLanguage.test(normalized)
306
+ || englishUnsupportedLanguage.test(normalized)
307
+ || englishPresentation.test(normalized)
308
+ || englishDirectStyle.test(normalized)
309
+ || englishFutureStyle.test(normalized);
310
+ }
311
+ /**
312
+ * Classify a whole user message without interpreting arbitrary prose. Exact
313
+ * supported directives are separated from directive-like mixtures; callers
314
+ * must admit implicit behavior evidence only for `ordinary-content`.
315
+ */
316
+ export function classifyNaturalPreferenceDirective(text) {
317
+ const normalized = normalizedNaturalPreferenceText(text);
318
+ if (normalized !== undefined) {
319
+ const selection = exactDurablePreferenceSelection(normalized);
320
+ if (selection !== undefined)
321
+ return durableSelection(selection);
322
+ if (isExactOneTurnPreferenceDirective(normalized))
323
+ return oneTurnDirective;
324
+ }
325
+ return containsPotentialPreferenceDirective(text) ? ambiguousDirective : ordinaryContent;
326
+ }
327
+ /** Closed whole-message grammar; quoted prose, code, multiline, and long text abstain. */
328
+ export function parseNaturalPreferenceCorrection(text) {
329
+ const classification = classifyNaturalPreferenceDirective(text);
330
+ return classification.kind === 'durable-exact-selection'
331
+ ? classification.selection
332
+ : undefined;
333
+ }
334
+ /** One-turn style requests must not become durable preferences or opposite language evidence. */
335
+ export function isOneShotPreferenceRequest(text) {
336
+ return classifyNaturalPreferenceDirective(text).kind === 'one-turn-directive';
337
+ }
338
+ //# sourceMappingURL=feedback-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-command.js","sourceRoot":"","sources":["../src/feedback-command.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
- import { AssistantDeliveryService, Config } from './service.js';
2
+ import { AssistantDeliveryService, Config, isTrustedDeliveryPreferenceProducer } from './service.js';
3
3
  import { version } from './version.js';
4
4
  export declare const name = "dsh-enhanced-assistant-delivery";
5
- export { AssistantDeliveryService, Config, version };
5
+ export { AssistantDeliveryService, Config, isTrustedDeliveryPreferenceProducer, version };
6
6
  export type { DeliveryInboundRuntime } from './service.js';
7
7
  export * from './types.js';
8
8
  export * from './operator.js';
9
- export { externalPrincipalId } from './canonical.js';
9
+ export * from './learning-command.js';
10
+ export { externalPrincipalId, ownerRouteAuthorityHash } from './canonical.js';
10
11
  export declare function apply(ctx: Context, config: import('./service.js').Config): void;
11
12
  export default AssistantDeliveryService;
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,oCAAoC,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC1D,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED,eAAe,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAA;AACpG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,oCAAoC,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,mCAAmC,EAAE,OAAO,EAAE,CAAA;AACzF,YAAY,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC1D,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7E,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED,eAAe,wBAAwB,CAAA"}
package/lib/index.js CHANGED
@@ -1,10 +1,11 @@
1
- import { AssistantDeliveryService, Config } from './service.js';
1
+ import { AssistantDeliveryService, Config, isTrustedDeliveryPreferenceProducer } from './service.js';
2
2
  import { version } from './version.js';
3
3
  export const name = 'dsh-enhanced-assistant-delivery';
4
- export { AssistantDeliveryService, Config, version };
4
+ export { AssistantDeliveryService, Config, isTrustedDeliveryPreferenceProducer, version };
5
5
  export * from './types.js';
6
6
  export * from './operator.js';
7
- export { externalPrincipalId } from './canonical.js';
7
+ export * from './learning-command.js';
8
+ export { externalPrincipalId, ownerRouteAuthorityHash } from './canonical.js';
8
9
  export function apply(ctx, config) {
9
10
  new AssistantDeliveryService(ctx, config);
10
11
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,iCAAiC,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAEpD,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAqC;IACvE,IAAI,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC3C,CAAC;AAED,eAAe,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAA;AACpG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,iCAAiC,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,mCAAmC,EAAE,OAAO,EAAE,CAAA;AAEzF,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7E,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAqC;IACvE,IAAI,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC3C,CAAC;AAED,eAAe,wBAAwB,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { DeliveryLearningExportDocument } from './types.js';
2
+ export type LearningCommand = {
3
+ readonly kind: 'help';
4
+ } | {
5
+ readonly kind: 'status';
6
+ } | {
7
+ readonly kind: 'explain';
8
+ } | {
9
+ readonly kind: 'export';
10
+ } | {
11
+ readonly kind: 'pause';
12
+ } | {
13
+ readonly kind: 'resume';
14
+ } | {
15
+ readonly kind: 'rollback-confirm';
16
+ readonly preferenceKey: DeliveryT1PreferenceKey;
17
+ } | {
18
+ readonly kind: 'forget-confirm';
19
+ } | {
20
+ readonly kind: 'forget-prompt';
21
+ } | {
22
+ readonly kind: 'invalid';
23
+ };
24
+ export declare const learningCommandUsage: string;
25
+ /** Closed Host catalog subset that owner rollback is allowed to address. */
26
+ export declare const deliveryT1PreferenceKeys: readonly ["response.verbosity", "response.structure", "response.language", "response.explanation_depth", "suggestion.frequency", "recommendation.ranking"];
27
+ export type DeliveryT1PreferenceKey = typeof deliveryT1PreferenceKeys[number];
28
+ export declare const deliveryT1PreferenceValues: Readonly<{
29
+ 'response.verbosity': readonly string[];
30
+ 'response.structure': readonly string[];
31
+ 'response.language': readonly string[];
32
+ 'response.explanation_depth': readonly string[];
33
+ 'suggestion.frequency': readonly string[];
34
+ 'recommendation.ranking': readonly string[];
35
+ }>;
36
+ /** Serialize only an already-validated export receipt with stable recursive key ordering. */
37
+ export declare function serializeLearningExport(document: Readonly<DeliveryLearningExportDocument>): string;
38
+ /** Parse a deliberately closed, case-sensitive owner control grammar. */
39
+ export declare function parseLearningCommand(rawInput: string): LearningCommand;
40
+ //# sourceMappingURL=learning-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-command.d.ts","sourceRoot":"","sources":["../src/learning-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAMhE,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEhC,eAAO,MAAM,oBAAoB,QAWrB,CAAA;AAEZ,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,4JAA4B,CAAA;AAEjE,MAAM,MAAM,uBAAuB,GAAG,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AAE7E,eAAO,MAAM,0BAA0B;;;;;;;EAA8B,CAAA;AAWrE,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,8BAA8B,CAAC,GAAG,MAAM,CAElG;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAkBtE"}
@@ -0,0 +1,57 @@
1
+ import { assistantT1PreferenceKeys, assistantT1PreferenceValues, } from '@dsh-enhanced/assistant-growth-contract';
2
+ export const learningCommandUsage = [
3
+ '学习控制命令:',
4
+ '- /learning status:查看当前工作区与 preset 的学习状态。',
5
+ '- /learning explain:查看当前 owner 的 T1 偏好键、值、状态、版本与证据计数。',
6
+ '- /learning export:以版本化稳定 JSON 导出当前 scope 的 content-free T1 摘要。',
7
+ '- /learning pause:暂停收集、激活和注入偏好;已有记录保留。',
8
+ '- /learning resume:恢复学习,并重新使用已有的有效偏好。',
9
+ '- /learning rollback <T1-key> confirm:回滚该键当前激活的偏好。',
10
+ '- /learning forget confirm:永久删除当前工作区与 preset 的偏好学习记录。',
11
+ '',
12
+ '删除不可撤销;必须完整输入 forget confirm,单独输入 forget 不会删除。',
13
+ ].join('\n');
14
+ /** Closed Host catalog subset that owner rollback is allowed to address. */
15
+ export const deliveryT1PreferenceKeys = assistantT1PreferenceKeys;
16
+ export const deliveryT1PreferenceValues = assistantT1PreferenceValues;
17
+ function canonicalJsonValue(value) {
18
+ if (Array.isArray(value))
19
+ return value.map(canonicalJsonValue);
20
+ if (value === null || typeof value !== 'object')
21
+ return value;
22
+ const record = value;
23
+ return Object.fromEntries(Object.keys(record).sort().map(key => [key, canonicalJsonValue(record[key])]));
24
+ }
25
+ /** Serialize only an already-validated export receipt with stable recursive key ordering. */
26
+ export function serializeLearningExport(document) {
27
+ return JSON.stringify(canonicalJsonValue(document), null, 2);
28
+ }
29
+ /** Parse a deliberately closed, case-sensitive owner control grammar. */
30
+ export function parseLearningCommand(rawInput) {
31
+ // `rawInput` is the exact suffix after `/learning`. Keep the irreversible
32
+ // confirmation byte-exact: one ASCII space separates every token and no
33
+ // surrounding or Unicode whitespace is normalized into authority.
34
+ if (rawInput === '' || rawInput === ' help')
35
+ return { kind: 'help' };
36
+ if (rawInput === ' status')
37
+ return { kind: 'status' };
38
+ if (rawInput === ' explain')
39
+ return { kind: 'explain' };
40
+ if (rawInput === ' export')
41
+ return { kind: 'export' };
42
+ if (rawInput === ' pause')
43
+ return { kind: 'pause' };
44
+ if (rawInput === ' resume')
45
+ return { kind: 'resume' };
46
+ for (const preferenceKey of deliveryT1PreferenceKeys) {
47
+ if (rawInput === ` rollback ${preferenceKey} confirm`) {
48
+ return { kind: 'rollback-confirm', preferenceKey };
49
+ }
50
+ }
51
+ if (rawInput === ' forget')
52
+ return { kind: 'forget-prompt' };
53
+ if (rawInput === ' forget confirm')
54
+ return { kind: 'forget-confirm' };
55
+ return { kind: 'invalid' };
56
+ }
57
+ //# sourceMappingURL=learning-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-command.js","sourceRoot":"","sources":["../src/learning-command.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,yCAAyC,CAAA;AAchD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS;IACT,2CAA2C;IAC3C,uDAAuD;IACvD,iEAAiE;IACjE,wCAAwC;IACxC,uCAAuC;IACvC,oDAAoD;IACpD,uDAAuD;IACvD,EAAE;IACF,gDAAgD;CACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAAA;AAIjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,2BAA2B,CAAA;AAErE,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,MAAM,GAAG,KAA0C,CAAA;IACzD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC9E,CAAA;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,uBAAuB,CAAC,QAAkD;IACxF,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,0EAA0E;IAC1E,wEAAwE;IACxE,kEAAkE;IAClE,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACrD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IACvD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACnD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACrD,KAAK,MAAM,aAAa,IAAI,wBAAwB,EAAE,CAAC;QACrD,IAAI,QAAQ,KAAK,aAAa,aAAa,UAAU,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAA;QACpD,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;IAC5D,IAAI,QAAQ,KAAK,iBAAiB;QAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAA;IACrE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AAC5B,CAAC"}