@dsh-enhanced/preference-learning 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/cordis.patch.yml +19 -0
- package/lib/catalog.d.ts +88 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +124 -0
- package/lib/catalog.js.map +1 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -0
- package/lib/service.d.ts +67 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +260 -0
- package/lib/service.js.map +1 -0
- package/lib/sqlite.d.ts +9 -0
- package/lib/sqlite.d.ts.map +1 -0
- package/lib/sqlite.js +214 -0
- package/lib/sqlite.js.map +1 -0
- package/lib/store.d.ts +47 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +769 -0
- package/lib/store.js.map +1 -0
- package/lib/tools.d.ts +4 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +125 -0
- package/lib/tools.js.map +1 -0
- package/lib/types.d.ts +103 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +17 -0
- package/lib/types.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +2 -0
- package/lib/version.js.map +1 -0
- package/package.json +97 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-enhanced contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# @dsh-enhanced/preference-learning
|
|
2
|
+
|
|
3
|
+
面向个人助理的有界偏好学习。插件把可信 Host 产生的离散信号汇总为可审计假设,并且只允许证据充分的低风险 T1 偏好进入临时、可回滚的 Agent overlay。它不会从聊天正文自由推断规则,也不会把 tentative 偏好冒充用户确认事实。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
dsh plugin --profile web add @dsh-enhanced/preference-learning
|
|
9
|
+
dsh --profile web --dump-config
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
插件需要 `assistant-policy` 与 DSH `system-prompt`。安装 `assistant-delivery` 时会自动订阅它验证过的 `/feedback` typed event;Delivery 是可选 producer,不构成本插件的启动依赖。Profile 必须为目标 Agent 明确授权:
|
|
13
|
+
|
|
14
|
+
- `review` / `activate` / `rollback` / `snapshot`,资源 `preference:*`;
|
|
15
|
+
- `execute`,资源 `tool:preference_*`。
|
|
16
|
+
|
|
17
|
+
未授权时默认拒绝,跨 workspace 或 Agent preset 的假设不可见。
|
|
18
|
+
|
|
19
|
+
## 风险模型
|
|
20
|
+
|
|
21
|
+
风险等级和值来自只读 Host catalog,调用者不能提交自由文本或自报风险等级:
|
|
22
|
+
|
|
23
|
+
- T0:只记录结构化观测,不生成行为假设;
|
|
24
|
+
- T1:格式、语言、详略、建议频率和推荐排序等本地可逆偏好;先处于 `shadow`,证据达标后才可激活;
|
|
25
|
+
- T2:长期记忆、自动通知、外部承诺、数据边界和预算策略;仅形成 `proposed + inactive`,本插件不能激活;
|
|
26
|
+
- T3:审批边界、凭据、安全风险目录和破坏性默认值;拒绝记录为偏好证据。
|
|
27
|
+
|
|
28
|
+
`actorTrust`(谁给出的信号)与 `interpretationTrust`(如何解释信号)分别保存。`tentative + active` 仍然不是 `confirmed`;本插件没有确认或写入 Memory 的 API。
|
|
29
|
+
|
|
30
|
+
## 信号接入
|
|
31
|
+
|
|
32
|
+
owner 反馈只接受 `assistant-delivery` 的 `/feedback` 命令。Delivery 会先验证 exact active binding、Inbox/envelope、active owner、inbound/reply Policy 和 durable dispatch fence,再取得 exact external owner 的 `signal` / `preference:<preset>/<catalog-key>` Policy 授权,最后调用本插件私有注册的唯一 batch sink。该 sink 在一个 SQLite 事务内提交整批信号并返回逐项 durable receipt;`preference-learning` 没有任何公开方法可自报 `owner-authenticated`、`direct-owner-feedback` 或跨 scope owner 证据。
|
|
33
|
+
|
|
34
|
+
其他 Host producer 只能提交低信任观测:
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
ctx.assistantPreferenceLearning.appendObservation({
|
|
38
|
+
scope: { workspace: '/absolute/workspace', preset: 'primary' },
|
|
39
|
+
preferenceKey: 'response.verbosity',
|
|
40
|
+
candidateValue: 'concise',
|
|
41
|
+
stance: 'support',
|
|
42
|
+
interpretationTrust: 'behavioral-inference',
|
|
43
|
+
source: 'system-observation',
|
|
44
|
+
occurredAt: Date.now(),
|
|
45
|
+
idempotencyKey: 'producer-owned-event-id',
|
|
46
|
+
})
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
服务固定赋予这类输入 `system-attested`,且只接受 `behavioral-inference` / `model-inference` 与非 owner 来源。它们可形成 shadow 供审计,但不能激活或回滚偏好。原始幂等键按 producer lane 做域隔离哈希,聊天正文不进入账本。
|
|
50
|
+
|
|
51
|
+
模型可见工具只有:
|
|
52
|
+
|
|
53
|
+
- `preference_review`:读取当前 Agent scope 的有界假设;
|
|
54
|
+
- `preference_activate`:用 `hypothesis_id + expected_version` 激活证据达标的 T1;
|
|
55
|
+
- `preference_rollback`:用 `hypothesis_id + expected_version` 请求移除 shadow/active 假设;审计原因由 Host 固定,模型不能声称“owner 已拒绝”或伪造回归。
|
|
56
|
+
|
|
57
|
+
每个 Agent 实例最多尝试一次偏好变更。未验证身份、行为推断或模型推断可以形成 shadow,但无论累计多少,都不能满足自动激活门槛,也不能自动回滚已激活偏好。只有经过 Delivery 验证的 owner typed feedback 参与 effect 决策;最新一次 owner 明确选择优先于旧信号,改变选择会先撤掉旧 effect,新候选仍需独立达到激活门槛。
|
|
58
|
+
|
|
59
|
+
激活后的 prompt 由固定 catalog renderer 生成,当前请求始终优先。插件使用 DSH dynamic runtime context,在每个模型步骤重新读取 exact Agent scope,并由 AgentLoop 替换上一份快照。owner 更正、TTL 到期、显式回滚、forget、禁用/卸载和 session resume 都不会留下永久历史指令;下一步会得到新快照或明确清除旧快照。`overlayForAgent()` 是其他 Host prompt composer 的同一有界接入面。
|
|
60
|
+
|
|
61
|
+
## 配置
|
|
62
|
+
|
|
63
|
+
| 配置 | 默认值 | 作用 |
|
|
64
|
+
|---|---:|---|
|
|
65
|
+
| `enabled` | `true` | `false` 时停止收集、激活和注入;仍可审计、回滚和执行 Host forget |
|
|
66
|
+
| `databasePath` | Patch 设置 | 私有 SQLite 文件的绝对路径 |
|
|
67
|
+
| `signalTtlMs` | 90 天 | 信号衰减和保留窗口,硬上限 365 天 |
|
|
68
|
+
| `hypothesisTtlMs` | 30 天 | 假设 TTL,硬上限 30 天且不得大于信号窗口 |
|
|
69
|
+
| `minSignalsForActivation` | `2` | 激活所需最少支持信号 |
|
|
70
|
+
| `minConfidenceBps` | `7500` | 最低置信度(万分比) |
|
|
71
|
+
| `maxContradictionBps` | `2500` | 最大矛盾比例(万分比) |
|
|
72
|
+
| `maxActiveOverlays` | `6` | 单 scope 活跃 overlay 硬上限(最多 8) |
|
|
73
|
+
| `maxReviewHypotheses` | `20` | 单次审计上限(最多 50) |
|
|
74
|
+
| `maxOverlayBytes` | `2048` | 固定 renderer 输出硬上限 |
|
|
75
|
+
| `maintenanceIntervalMs` | 1 小时 | 有界清理过期 signal 的周期(1 分钟至 24 小时) |
|
|
76
|
+
| `maintenanceBatchSize` | `500` | 每轮物理清理的最大 signal 数(最多 5000) |
|
|
77
|
+
|
|
78
|
+
置信度使用固定 actor/interpretation 权重、时间衰减、支持/矛盾质量和证据覆盖率计算;不调用模型打分。证据或状态更新与信号写入位于同一 `BEGIN IMMEDIATE` 事务中。
|
|
79
|
+
|
|
80
|
+
## 隐私、权限与数据
|
|
81
|
+
|
|
82
|
+
- 文件系统:创建并读写 `databasePath`;目录权限为 `0700`、数据库为 `0600`,SQLite 使用 WAL、`synchronous=FULL`、`secure_delete=ON` 和外键。
|
|
83
|
+
- 数据内容:保存规范化绝对 workspace、Agent preset、固定 catalog key/value、信任枚举、时间和哈希标识;不保存聊天正文、自由文本解释、凭据或原始幂等键。
|
|
84
|
+
- 保留与删除:`signalTtlMs` 是 evidence window,也是真实 signal 保留期限;后台按有界批次物理删除过期行,极端 backlog 会跨多轮收敛。假设、状态迁移和 forget tombstone 属于审计状态,不按 signal TTL 删除。可信 Host 可调用 `forgetScope(scope, idempotencyKey)` 删除该 exact scope 的信号、假设和状态历史,只保留不可逆 scope digest tombstone,阻止旧事件重放;返回成功前还会完成并验证 WAL truncate,若读者占用导致 checkpoint busy,则以 `privacy-purge-pending` 要求按同一幂等键重试,而不虚报物理清除。没有模型可见删除工具。
|
|
85
|
+
- 网络、子进程、浏览器、凭据、安装脚本:无。
|
|
86
|
+
|
|
87
|
+
## 限制
|
|
88
|
+
|
|
89
|
+
owner 身份与 `/feedback` 命令由 `assistant-delivery` 负责;未安装 Delivery 时仍可记录低信任系统观测,但不会产生可自动激活的 owner 证据。T2 的批准与 Memory 持久化属于独立、审批化的后续集成。当前学习只改变固定低风险表达偏好,不改变 Policy、工具权限、凭据、预算或安全阈值。
|
|
90
|
+
|
|
91
|
+
## 兼容性
|
|
92
|
+
|
|
93
|
+
基线见仓库的 [compatibility.md](../../docs/compatibility.md)。
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
- insert:
|
|
2
|
+
- id: dsh-enhanced-preference-learning
|
|
3
|
+
name: '@dsh-enhanced/preference-learning'
|
|
4
|
+
inject:
|
|
5
|
+
- assistantPolicy
|
|
6
|
+
- systemPrompt
|
|
7
|
+
config:
|
|
8
|
+
enabled: true
|
|
9
|
+
databasePath: !!js dshHomePath('preference-learning/preferences.sqlite')
|
|
10
|
+
signalTtlMs: 7776000000
|
|
11
|
+
hypothesisTtlMs: 2592000000
|
|
12
|
+
minSignalsForActivation: 2
|
|
13
|
+
minConfidenceBps: 7500
|
|
14
|
+
maxContradictionBps: 2500
|
|
15
|
+
maxActiveOverlays: 6
|
|
16
|
+
maxReviewHypotheses: 20
|
|
17
|
+
maxOverlayBytes: 2048
|
|
18
|
+
maintenanceIntervalMs: 3600000
|
|
19
|
+
maintenanceBatchSize: 500
|
package/lib/catalog.d.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export declare const preferenceRiskTiers: readonly ["T0", "T1", "T2", "T3"];
|
|
2
|
+
export type PreferenceRiskTier = typeof preferenceRiskTiers[number];
|
|
3
|
+
/**
|
|
4
|
+
* Host-owned catalog. Callers select an exact key/value pair; they cannot add
|
|
5
|
+
* values, render instructions, or lower a key's risk tier.
|
|
6
|
+
*/
|
|
7
|
+
export declare const preferenceCatalog: Readonly<{
|
|
8
|
+
readonly 'feedback.response': Readonly<{
|
|
9
|
+
riskTier: "T0";
|
|
10
|
+
values: readonly string[];
|
|
11
|
+
}>;
|
|
12
|
+
readonly 'interaction.response': Readonly<{
|
|
13
|
+
riskTier: "T0";
|
|
14
|
+
values: readonly string[];
|
|
15
|
+
}>;
|
|
16
|
+
readonly 'response.verbosity': Readonly<{
|
|
17
|
+
riskTier: "T1";
|
|
18
|
+
values: readonly string[];
|
|
19
|
+
}>;
|
|
20
|
+
readonly 'response.structure': Readonly<{
|
|
21
|
+
riskTier: "T1";
|
|
22
|
+
values: readonly string[];
|
|
23
|
+
}>;
|
|
24
|
+
readonly 'response.language': Readonly<{
|
|
25
|
+
riskTier: "T1";
|
|
26
|
+
values: readonly string[];
|
|
27
|
+
}>;
|
|
28
|
+
readonly 'response.explanation_depth': Readonly<{
|
|
29
|
+
riskTier: "T1";
|
|
30
|
+
values: readonly string[];
|
|
31
|
+
}>;
|
|
32
|
+
readonly 'suggestion.frequency': Readonly<{
|
|
33
|
+
riskTier: "T1";
|
|
34
|
+
values: readonly string[];
|
|
35
|
+
}>;
|
|
36
|
+
readonly 'recommendation.ranking': Readonly<{
|
|
37
|
+
riskTier: "T1";
|
|
38
|
+
values: readonly string[];
|
|
39
|
+
}>;
|
|
40
|
+
readonly 'memory.retention': Readonly<{
|
|
41
|
+
riskTier: "T2";
|
|
42
|
+
values: readonly string[];
|
|
43
|
+
}>;
|
|
44
|
+
readonly 'automation.notification_time': Readonly<{
|
|
45
|
+
riskTier: "T2";
|
|
46
|
+
values: readonly string[];
|
|
47
|
+
}>;
|
|
48
|
+
readonly 'external.commitments': Readonly<{
|
|
49
|
+
riskTier: "T2";
|
|
50
|
+
values: readonly string[];
|
|
51
|
+
}>;
|
|
52
|
+
readonly 'provider.data_boundary': Readonly<{
|
|
53
|
+
riskTier: "T2";
|
|
54
|
+
values: readonly string[];
|
|
55
|
+
}>;
|
|
56
|
+
readonly 'budget.strategy': Readonly<{
|
|
57
|
+
riskTier: "T2";
|
|
58
|
+
values: readonly string[];
|
|
59
|
+
}>;
|
|
60
|
+
readonly 'policy.approval_boundary': Readonly<{
|
|
61
|
+
riskTier: "T3";
|
|
62
|
+
values: readonly string[];
|
|
63
|
+
}>;
|
|
64
|
+
readonly 'credentials.access': Readonly<{
|
|
65
|
+
riskTier: "T3";
|
|
66
|
+
values: readonly string[];
|
|
67
|
+
}>;
|
|
68
|
+
readonly 'safety.risk_catalog': Readonly<{
|
|
69
|
+
riskTier: "T3";
|
|
70
|
+
values: readonly string[];
|
|
71
|
+
}>;
|
|
72
|
+
readonly 'destructive.defaults': Readonly<{
|
|
73
|
+
riskTier: "T3";
|
|
74
|
+
values: readonly string[];
|
|
75
|
+
}>;
|
|
76
|
+
}>;
|
|
77
|
+
export type PreferenceKey = keyof typeof preferenceCatalog;
|
|
78
|
+
export interface CatalogSelection {
|
|
79
|
+
key: PreferenceKey;
|
|
80
|
+
value: string;
|
|
81
|
+
riskTier: PreferenceRiskTier;
|
|
82
|
+
}
|
|
83
|
+
export declare class PreferenceCatalogError extends Error {
|
|
84
|
+
constructor(message: string);
|
|
85
|
+
}
|
|
86
|
+
export declare function catalogSelection(keyInput: unknown, valueInput: unknown): CatalogSelection;
|
|
87
|
+
export declare function renderCatalogPreference(keyInput: unknown, valueInput: unknown): string;
|
|
88
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,mCAAoC,CAAA;AACpE,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDnB,CAAA;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,iBAAiB,CAAA;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,aAAa,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,kBAAkB,CAAA;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,gBAAgB,CAazF;AAiCD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAQtF"}
|
package/lib/catalog.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export const preferenceRiskTiers = ['T0', 'T1', 'T2', 'T3'];
|
|
2
|
+
/**
|
|
3
|
+
* Host-owned catalog. Callers select an exact key/value pair; they cannot add
|
|
4
|
+
* values, render instructions, or lower a key's risk tier.
|
|
5
|
+
*/
|
|
6
|
+
export const preferenceCatalog = Object.freeze({
|
|
7
|
+
'feedback.response': Object.freeze({
|
|
8
|
+
riskTier: 'T0',
|
|
9
|
+
values: Object.freeze([
|
|
10
|
+
'helpful', 'not-helpful', 'too-long', 'too-short', 'wrong-format',
|
|
11
|
+
'wrong-action', 'unwanted-reminder',
|
|
12
|
+
]),
|
|
13
|
+
}),
|
|
14
|
+
'interaction.response': Object.freeze({
|
|
15
|
+
riskTier: 'T0',
|
|
16
|
+
values: Object.freeze(['acknowledged', 'ignored', 'retried', 'corrected']),
|
|
17
|
+
}),
|
|
18
|
+
'response.verbosity': Object.freeze({
|
|
19
|
+
riskTier: 'T1', values: Object.freeze(['concise', 'balanced', 'detailed']),
|
|
20
|
+
}),
|
|
21
|
+
'response.structure': Object.freeze({
|
|
22
|
+
riskTier: 'T1', values: Object.freeze(['prose', 'bullets', 'mixed']),
|
|
23
|
+
}),
|
|
24
|
+
'response.language': Object.freeze({
|
|
25
|
+
riskTier: 'T1', values: Object.freeze(['zh-CN', 'en']),
|
|
26
|
+
}),
|
|
27
|
+
'response.explanation_depth': Object.freeze({
|
|
28
|
+
riskTier: 'T1', values: Object.freeze(['result-first', 'balanced', 'tutorial']),
|
|
29
|
+
}),
|
|
30
|
+
'suggestion.frequency': Object.freeze({
|
|
31
|
+
riskTier: 'T1', values: Object.freeze(['low', 'normal']),
|
|
32
|
+
}),
|
|
33
|
+
'recommendation.ranking': Object.freeze({
|
|
34
|
+
riskTier: 'T1', values: Object.freeze(['recency', 'familiarity', 'evidence']),
|
|
35
|
+
}),
|
|
36
|
+
'memory.retention': Object.freeze({
|
|
37
|
+
riskTier: 'T2', values: Object.freeze(['session-only', 'long-term']),
|
|
38
|
+
}),
|
|
39
|
+
'automation.notification_time': Object.freeze({
|
|
40
|
+
riskTier: 'T2', values: Object.freeze(['fixed', 'learned']),
|
|
41
|
+
}),
|
|
42
|
+
'external.commitments': Object.freeze({
|
|
43
|
+
riskTier: 'T2', values: Object.freeze(['approval-required', 'preauthorized']),
|
|
44
|
+
}),
|
|
45
|
+
'provider.data_boundary': Object.freeze({
|
|
46
|
+
riskTier: 'T2', values: Object.freeze(['local-only', 'configured-provider']),
|
|
47
|
+
}),
|
|
48
|
+
'budget.strategy': Object.freeze({
|
|
49
|
+
riskTier: 'T2', values: Object.freeze(['fixed', 'adaptive']),
|
|
50
|
+
}),
|
|
51
|
+
'policy.approval_boundary': Object.freeze({
|
|
52
|
+
riskTier: 'T3', values: Object.freeze(['host-defined']),
|
|
53
|
+
}),
|
|
54
|
+
'credentials.access': Object.freeze({
|
|
55
|
+
riskTier: 'T3', values: Object.freeze(['host-defined']),
|
|
56
|
+
}),
|
|
57
|
+
'safety.risk_catalog': Object.freeze({
|
|
58
|
+
riskTier: 'T3', values: Object.freeze(['host-defined']),
|
|
59
|
+
}),
|
|
60
|
+
'destructive.defaults': Object.freeze({
|
|
61
|
+
riskTier: 'T3', values: Object.freeze(['host-defined']),
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
export class PreferenceCatalogError extends Error {
|
|
65
|
+
constructor(message) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.name = 'PreferenceCatalogError';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function catalogSelection(keyInput, valueInput) {
|
|
71
|
+
if (typeof keyInput !== 'string' || !Object.hasOwn(preferenceCatalog, keyInput)) {
|
|
72
|
+
throw new PreferenceCatalogError('preferenceKey is not in the Host preference catalog');
|
|
73
|
+
}
|
|
74
|
+
if (typeof valueInput !== 'string') {
|
|
75
|
+
throw new PreferenceCatalogError('candidateValue must be a catalog string');
|
|
76
|
+
}
|
|
77
|
+
const key = keyInput;
|
|
78
|
+
const entry = preferenceCatalog[key];
|
|
79
|
+
if (!entry.values.includes(valueInput)) {
|
|
80
|
+
throw new PreferenceCatalogError(`candidateValue is not allowed for ${key}`);
|
|
81
|
+
}
|
|
82
|
+
return Object.freeze({ key, value: valueInput, riskTier: entry.riskTier });
|
|
83
|
+
}
|
|
84
|
+
const t1Renderers = Object.freeze({
|
|
85
|
+
'response.verbosity': Object.freeze({
|
|
86
|
+
concise: 'Prefer concise responses.',
|
|
87
|
+
balanced: 'Prefer balanced response length.',
|
|
88
|
+
detailed: 'Prefer detailed responses when useful.',
|
|
89
|
+
}),
|
|
90
|
+
'response.structure': Object.freeze({
|
|
91
|
+
prose: 'Prefer prose over lists.',
|
|
92
|
+
bullets: 'Prefer bullet lists when they improve scanning.',
|
|
93
|
+
mixed: 'Use a mix of prose and lists according to the content.',
|
|
94
|
+
}),
|
|
95
|
+
'response.language': Object.freeze({
|
|
96
|
+
'zh-CN': 'Respond in Simplified Chinese unless the current request requires another language.',
|
|
97
|
+
en: 'Respond in English unless the current request requires another language.',
|
|
98
|
+
}),
|
|
99
|
+
'response.explanation_depth': Object.freeze({
|
|
100
|
+
'result-first': 'Lead with the result and keep explanation secondary.',
|
|
101
|
+
balanced: 'Balance the result with enough explanation to verify it.',
|
|
102
|
+
tutorial: 'Explain unfamiliar work in a tutorial style.',
|
|
103
|
+
}),
|
|
104
|
+
'suggestion.frequency': Object.freeze({
|
|
105
|
+
low: 'Offer optional suggestions sparingly.',
|
|
106
|
+
normal: 'Offer relevant optional suggestions at a normal frequency.',
|
|
107
|
+
}),
|
|
108
|
+
'recommendation.ranking': Object.freeze({
|
|
109
|
+
recency: 'Prefer recent options when evidence is otherwise comparable.',
|
|
110
|
+
familiarity: 'Prefer options already familiar to the user when evidence is otherwise comparable.',
|
|
111
|
+
evidence: 'Prefer the option with the strongest evidence.',
|
|
112
|
+
}),
|
|
113
|
+
});
|
|
114
|
+
export function renderCatalogPreference(keyInput, valueInput) {
|
|
115
|
+
const selection = catalogSelection(keyInput, valueInput);
|
|
116
|
+
if (selection.riskTier !== 'T1') {
|
|
117
|
+
throw new PreferenceCatalogError('only T1 preferences have an automatic overlay renderer');
|
|
118
|
+
}
|
|
119
|
+
const rendered = t1Renderers[selection.key]?.[selection.value];
|
|
120
|
+
if (rendered === undefined)
|
|
121
|
+
throw new PreferenceCatalogError('catalog renderer is incomplete');
|
|
122
|
+
return rendered;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { Config, PreferenceLearningService } from './service.js';
|
|
3
|
+
import type { Config as ConfigType } from './service.js';
|
|
4
|
+
import { version } from './version.js';
|
|
5
|
+
export declare const name = "dsh-enhanced-preference-learning";
|
|
6
|
+
export declare const inject: string[];
|
|
7
|
+
export { Config, PreferenceLearningService, version };
|
|
8
|
+
export type { ConfigType as PreferenceLearningConfig };
|
|
9
|
+
export { PreferenceLearningError } from './service.js';
|
|
10
|
+
export * from './catalog.js';
|
|
11
|
+
export * from './types.js';
|
|
12
|
+
export declare function apply(ctx: Context, config: ConfigType): void;
|
|
13
|
+
export default PreferenceLearningService;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,MAAM,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,qCAAqC,CAAA;AACtD,eAAO,MAAM,MAAM,UAAsC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAA;AACrD,YAAY,EAAE,UAAU,IAAI,wBAAwB,EAAE,CAAA;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAE1B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAE5D;AAED,eAAe,yBAAyB,CAAA"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Config, PreferenceLearningService } from './service.js';
|
|
2
|
+
import { version } from './version.js';
|
|
3
|
+
export const name = 'dsh-enhanced-preference-learning';
|
|
4
|
+
export const inject = ['assistantPolicy', 'systemPrompt'];
|
|
5
|
+
export { Config, PreferenceLearningService, version };
|
|
6
|
+
export { PreferenceLearningError } from './service.js';
|
|
7
|
+
export * from './catalog.js';
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export function apply(ctx, config) {
|
|
10
|
+
new PreferenceLearningService(ctx, config);
|
|
11
|
+
}
|
|
12
|
+
export default PreferenceLearningService;
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,IAAI,GAAG,kCAAkC,CAAA;AACtD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAA;AAErD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAE1B,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAkB;IACpD,IAAI,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC5C,CAAC;AAED,eAAe,yBAAyB,CAAA"}
|
package/lib/service.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Context, Service } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
3
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
4
|
+
import type { PreferenceForgetResult } from './store.js';
|
|
5
|
+
import type { PreferenceHealth, PreferenceHypothesis, PreferenceLimits, PreferenceMaintenanceResult, PreferenceObservationInput, PreferenceReview, PreferenceRollbackReason, PreferenceScope, StoredPreferenceSignal } from './types.js';
|
|
6
|
+
export interface Config {
|
|
7
|
+
enabled?: boolean;
|
|
8
|
+
databasePath: string;
|
|
9
|
+
signalTtlMs?: number;
|
|
10
|
+
hypothesisTtlMs?: number;
|
|
11
|
+
minSignalsForActivation?: number;
|
|
12
|
+
minConfidenceBps?: number;
|
|
13
|
+
maxContradictionBps?: number;
|
|
14
|
+
maxActiveOverlays?: number;
|
|
15
|
+
maxReviewHypotheses?: number;
|
|
16
|
+
maxOverlayBytes?: number;
|
|
17
|
+
maintenanceIntervalMs?: number;
|
|
18
|
+
maintenanceBatchSize?: number;
|
|
19
|
+
}
|
|
20
|
+
export type PreferenceLearningErrorCode = 'disabled' | 'disposed' | 'missing-agent' | 'policy-denied' | 'unattested-signal';
|
|
21
|
+
export declare class PreferenceLearningError extends Error {
|
|
22
|
+
readonly code: PreferenceLearningErrorCode;
|
|
23
|
+
constructor(code: PreferenceLearningErrorCode, message: string);
|
|
24
|
+
}
|
|
25
|
+
declare module '@deepseek-ai/cordis' {
|
|
26
|
+
interface Context {
|
|
27
|
+
assistantPreferenceLearning: PreferenceLearningService;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export declare class PreferenceLearningService extends Service {
|
|
31
|
+
static Config: Schema<Config>;
|
|
32
|
+
static inject: string[];
|
|
33
|
+
private readonly store;
|
|
34
|
+
private readonly policy;
|
|
35
|
+
private readonly config;
|
|
36
|
+
private active;
|
|
37
|
+
constructor(ctx: Context, input: Config, options?: {
|
|
38
|
+
now?: () => number;
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Unprivileged observation seam. Actor/source authority is assigned here;
|
|
42
|
+
* callers cannot use it to claim owner feedback or unlock an effect.
|
|
43
|
+
*/
|
|
44
|
+
appendObservation(input: PreferenceObservationInput): StoredPreferenceSignal;
|
|
45
|
+
review(agent: Agent | undefined, limit?: number): PreferenceReview;
|
|
46
|
+
activate(agent: Agent | undefined, hypothesisId: string, expectedVersion: number): PreferenceHypothesis;
|
|
47
|
+
rollback(agent: Agent | undefined, hypothesisId: string, expectedVersion: number, reason: PreferenceRollbackReason): PreferenceHypothesis;
|
|
48
|
+
/** Host-only privacy seam. It removes exact-scope rows and retains only a scope digest tombstone. */
|
|
49
|
+
forgetScope(scope: PreferenceScope, idempotencyKey: string): PreferenceForgetResult;
|
|
50
|
+
health(): PreferenceHealth;
|
|
51
|
+
limits(): PreferenceLimits;
|
|
52
|
+
/** Safe bounded maintenance seam used by health jobs and deterministic tests. */
|
|
53
|
+
maintain(): PreferenceMaintenanceResult;
|
|
54
|
+
/** Host integration seam for foreground prompt composition. */
|
|
55
|
+
overlayForAgent(agent: Agent | undefined): string | undefined;
|
|
56
|
+
private dynamicOverlay;
|
|
57
|
+
/**
|
|
58
|
+
* The closure is registered directly with Assistant Delivery. No public
|
|
59
|
+
* service method accepts owner-authenticated provenance.
|
|
60
|
+
*/
|
|
61
|
+
private appendDeliveryFeedbackBatch;
|
|
62
|
+
private authorizedScope;
|
|
63
|
+
private assertEnabled;
|
|
64
|
+
private assertActive;
|
|
65
|
+
}
|
|
66
|
+
export declare const Config: Schema<Config>;
|
|
67
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|