@dsh-enhanced/lark-channel 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,6 +20,7 @@ revision 投递一条内容无关的状态更新;两种路径的重试、fence
20
20
  - [安装、凭据与常驻服务](docs/setup.md)
21
21
  - [会话命令、卡片、可靠性与排障](docs/operations.md)
22
22
  - [分级自治成长激活器](docs/supervised-growth.md)
23
+ - [日常使用自迭代的双 Host 配置](docs/rsi-setup.md)
23
24
  - [进度展示、安全与权限边界](docs/progress-security.md)
24
25
 
25
26
  ## 兼容性
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runRsiSetup } from '../lib/rsi-setup.js'
4
+
5
+ void runRsiSetup().catch(error => {
6
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`)
7
+ process.exitCode = 1
8
+ })
@@ -0,0 +1,79 @@
1
+ # 日常使用自迭代的双 Host 配置
2
+
3
+ `dsh-rsi-setup` 将已配置的 Lark owner 目标 profile 和独立采用协调器接入原生 Automations。目标 Host 从真实任务反馈形成源码修复,协调器在目标重启期间继续有限交接;目标恢复后重验当前 owner 和反馈,再完成采用。后续任务进入观察与回滚流程。
4
+
5
+ 当前入口要求 Linux、可用的 systemd user session、两个已安装的 profile,以及已配置的有限授权器和 release/Host adapters。它负责核对授权与配置、成对写入和启动服务;完整生产部署还需要独立行为观测与实际使用验收。源码发布轨使用授权的本地 registry,仓库公共 npm 发版仍走仓库发布流程。
6
+
7
+ ## 1. 准备两个 profile
8
+
9
+ 目标先完成 [Lark 配对](setup.md)与 [supervised 安装](supervised-growth.md),已有唯一 active owner DM 和有效 owner route。为目标补装同一构建的 Growth Driver、Goals、Skills、Verifier 与 Control Plane。开发版应使用本地构建的包;仅有相同版本号不能证明含有这些新增 API。
10
+
11
+ ```sh
12
+ dsh plugin --profile web add \
13
+ @dsh-enhanced/assistant-growth-driver \
14
+ @dsh-enhanced/assistant-goals \
15
+ @dsh-enhanced/assistant-skills \
16
+ @dsh-enhanced/assistant-verifier \
17
+ @dsh-enhanced/plugin-control-plane
18
+
19
+ dsh plugin --profile rsi-coordinator add \
20
+ @dsh-enhanced/assistant-policy \
21
+ @dsh-enhanced/assistant-automations \
22
+ @dsh-enhanced/plugin-control-plane
23
+ ```
24
+
25
+ 协调器使用新的自定义 profile,默认从 DSH base 创建。勿从 `web` 模板复制:协调器不需要 Web 服务或第二个 Lark 入口。目标和协调器的 Policy/Automations 状态分开;协调器 Control Plane 的主库独立,专用采用连接按目标 trust 中的精确路径读取共享交接账本。
26
+
27
+ ## 2. 准备一次性有限授权 manifest
28
+
29
+ manifest 是 owner 私有的 JSON(`chmod 600`),路径须 canonical,不含 symlink。它引用已存在的私有授权器配置、key、trust、catalog 和控制账本。配置器读取并验证这些文件,不生成授权或签名回执。
30
+
31
+ | 字段 | 要求 |
32
+ | --- | --- |
33
+ | `schemaVersion` | `1` |
34
+ | `targetProfile` / `coordinatorProfile` | 已安装且不同的 profile 名 |
35
+ | `controlPlane` | 目标的完整 Control Plane config;必需 `sourceBuild`、`sourceJobs`、`sourceApprovals`、`sourceReleases`、`sourceReleaseExecution`、`sourceAdoptions.handoff`、`runtimeObserver`、`foregroundDeployments`、`taskObservations` |
36
+ | `growthDriver` | 完整 Growth config;`enabled: true`、`intervalMs: 0`、启用 `usageLearning` 与 durable `pluginSourceProposals`,绑定同一 owner/workspace/preset/repository |
37
+ | `sourceReviews` | 有限独立审查授权;owner 精确匹配当前 Delivery 记录,decisionRoot 与发布轨一致 |
38
+ | `coordinator` | `{ "budgetId": "rsi-adoption", "budgetAmount": 1, "timeoutMs": 900000 }`,按实际约束设置 |
39
+ | `limits` | 例如 `{ "periodMs": 86400000, "reviews": 5, "discovery": 1440, "source": 1440, "observations": 1440, "coordinator": 1440 }`;均为显式有限额度 |
40
+
41
+ 具体配置契约见 [Control Plane](../../plugin-control-plane/README.md)、[Growth Driver](../../assistant-growth-driver/README.md)、[Verifier](../../assistant-verifier/README.md)。四份签名授权必须使用相同 owner、目标 ledger 与插件白名单,并与 trust 登记的公钥一致。采用授权绑定 executor、profile、handoff;观察授权绑定包名单和观察策略。所有授权须在有效期内。
42
+
43
+ 不填 Growth `provider/model` 和 Verifier `sourceReviews.model` 时继承来源任务的实际模型。需要固定修复或审查供应时显式配置;历史任务已冻结的模型不会跟随之后的会话切换。
44
+
45
+ 扫描、源码作业、观察与协调器使用 `subject` scope 的 `automation-runs` budget;模型复盘使用 `global` scope 汇总。Policy 按 scope、metric、period 计量,改 budget ID 不会隔离同一计数池。源码额度按每个原生 automation identity 计量,总作业数另由有限 `sourceJobs.maxSubmissions` 限制。空扫描也消耗配置额度;额度应覆盖所需扫描频率。已有同周期全局规则的额度必须兼容。配置器不会打开 `allowUnbudgetedExecution`。
46
+
47
+ ## 3. 校验、应用、启动
48
+
49
+ ```sh
50
+ ~/.dsh/profiles/web/node_modules/.bin/dsh-rsi-setup \
51
+ --manifest /private/owner/rsi.json
52
+ ```
53
+
54
+ 默认只读组合 profile、核对当前 owner 与有限授权,不修改 profile 或启动服务。`DSH_HOME` 可由环境变量或 `--dsh-home /absolute/path` 指定。
55
+
56
+ 应用前停止两个 Host(包括手工启动的进程),并确认没有其他 writer。命令同时检查对应 systemd unit 处于 stopped 状态;系统服务状态不能证明手工进程已停止。
57
+
58
+ ```sh
59
+ systemctl --user stop dsh-profile-web.service dsh-profile-rsi-coordinator.service
60
+ ~/.dsh/profiles/web/node_modules/.bin/dsh-rsi-setup \
61
+ --manifest /private/owner/rsi.json --apply --confirm-hosts-stopped --start
62
+ ```
63
+
64
+ 使用同一 DSH_HOME lifecycle lock;写入前重查 manifest、owner snapshot 和两个原始 patch,保留有效配置中的其他字段与 `!!js`。成对写入后再次运行 `dsh --dump-config` 检查。`--start` 复用已有常驻服务安装器,先启动协调器,再启动目标;省略该参数只保存配置。
65
+
66
+ ## 恢复与停止
67
+
68
+ 配置 journal 存在 `DSH_HOME/.rsi-setup-journal.json`,为私有文件,含上次变更前后的两个 patch。写入或最终组合失败时自动恢复;崩溃留下 prepared journal 时先执行回滚。重复应用相同配置不会覆盖原回滚点。只有最近一次变更可由此入口恢复。
69
+
70
+ ```sh
71
+ ~/.dsh/profiles/web/node_modules/.bin/dsh-rsi-setup \
72
+ --manifest /private/owner/rsi.json --rollback --confirm-hosts-stopped
73
+ ```
74
+
75
+ 回滚前仍须停止两个 Host。恢复不要求前向授权仍未过期;若任一 patch 被外部改过,会保留 journal 并拒绝覆盖。服务启动失败时保留已应用配置,先排查/停止服务再决定恢复,避免改写活跃 Host。
76
+
77
+ 暂停自迭代可停止协调器及目标的相关 Automations,或撤销有限授权;重启不重置额度,也不重放 unknown 外部动作。授权续期需要新的合法授权标识与配置。配置 journal 只恢复 profile;已发布或已采用能力的回退仍由 Control Plane 的签名恢复链负责。
78
+
79
+ 此 CLI 读取 owner 数据库与私有配置;默认检查也会使用本地 lifecycle 锁和临时 WAL 快照,但不改变 profile 或业务状态。显式应用写两个 profile patch 和 journal;校验会执行本地 `dsh --dump-config`、`systemctl show`,显式启动会安装/启用/restart 用户级服务。它不向其他人发送消息。原始授权、私钥、数据库、journal 与运行日志留本地,不提交 GitHub。
@@ -0,0 +1,44 @@
1
+ import { type ActiveLarkOwnerBinding } from '@dsh-enhanced/assistant-delivery';
2
+ import { type AssistantGrowthDriverConfig } from '@dsh-enhanced/assistant-growth-driver';
3
+ import { type Config as ControlPlaneConfig } from '@dsh-enhanced/plugin-control-plane';
4
+ import { type SourceReviewConfig } from '@dsh-enhanced/assistant-verifier';
5
+ /** Private, owner supplied input for the two-host RSI overlay. */
6
+ export interface RsiSetupManifest {
7
+ schemaVersion: 1;
8
+ targetProfile: string;
9
+ coordinatorProfile: string;
10
+ controlPlane: ControlPlaneConfig;
11
+ growthDriver: AssistantGrowthDriverConfig;
12
+ sourceReviews: SourceReviewConfig;
13
+ coordinator: {
14
+ budgetId: string;
15
+ budgetAmount: number;
16
+ timeoutMs: number;
17
+ };
18
+ limits: {
19
+ periodMs: number;
20
+ reviews: number;
21
+ discovery: number;
22
+ source: number;
23
+ observations: number;
24
+ coordinator: number;
25
+ };
26
+ }
27
+ /**
28
+ * Read-only profile compiler. The caller owns private manifest I/O, lifecycle locks,
29
+ * atomic writes and post-write DSH composition checks.
30
+ */
31
+ export declare function compileRsiProfiles(input: {
32
+ manifest: RsiSetupManifest;
33
+ dshHome: string;
34
+ targetPatch: string;
35
+ targetEffective: string;
36
+ coordinatorPatch: string;
37
+ coordinatorEffective: string;
38
+ coordinatorBase: string;
39
+ owner: ActiveLarkOwnerBinding;
40
+ }): Promise<{
41
+ targetPatch: string;
42
+ coordinatorPatch: string;
43
+ }>;
44
+ //# sourceMappingURL=rsi-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-profile.d.ts","sourceRoot":"","sources":["../src/rsi-profile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC5H,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,uCAAuC,CAAA;AACzG,OAAO,EAA+B,KAAK,MAAM,IAAI,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACnH,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAGtG,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,CAAC,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,2BAA2B,CAAA;IACzC,aAAa,EAAE,kBAAkB,CAAA;IACjC,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1E,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5H;AAoJD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAgFzT"}
@@ -0,0 +1,292 @@
1
+ import { isAbsolute, join, resolve } from 'node:path';
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { externalPrincipalId, ownerRouteAuthorityHash } from '@dsh-enhanced/assistant-delivery';
4
+ import { normalizeConfig } from '@dsh-enhanced/assistant-growth-driver';
5
+ import { normalizeControlPlaneConfig } from '@dsh-enhanced/plugin-control-plane';
6
+ import { validateSourceReviewConfig } from '@dsh-enhanced/assistant-verifier';
7
+ import { isMap, isSeq, parseDocument } from 'yaml';
8
+ const targetBundles = [
9
+ 'dsh-enhanced-personal-assistant', 'dsh-enhanced-assistant-delivery', 'dsh-enhanced-lark-channel',
10
+ 'dsh-enhanced-assistant-evaluation', 'dsh-enhanced-assistant-goals', 'dsh-enhanced-assistant-skills',
11
+ 'dsh-enhanced-assistant-verifier', 'dsh-enhanced-assistant-growth-driver', 'dsh-enhanced-plugin-control-plane',
12
+ ];
13
+ const coordinatorBundles = new Set(['dsh-enhanced-assistant-policy', 'dsh-enhanced-assistant-automations', 'dsh-enhanced-plugin-control-plane']);
14
+ const coordinatorBundleNames = new Map([
15
+ ['dsh-enhanced-assistant-policy', '@dsh-enhanced/assistant-policy'],
16
+ ['dsh-enhanced-assistant-automations', '@dsh-enhanced/assistant-automations'],
17
+ ['dsh-enhanced-plugin-control-plane', '@dsh-enhanced/plugin-control-plane'],
18
+ ]);
19
+ const rsiPrefix = 'rsi-setup-';
20
+ function fail(message) { throw new Error(`rsi setup: ${message}`); }
21
+ function map(value, label) { if (!isMap(value))
22
+ fail(`${label} must be a YAML mapping`); return value; }
23
+ function seq(value, label) { if (!isSeq(value))
24
+ fail(`${label} must be a YAML sequence`); return value; }
25
+ function parse(value, label) {
26
+ const document = parseDocument(value, { uniqueKeys: true });
27
+ if (document.errors.length)
28
+ fail(`invalid ${label} YAML: ${document.errors[0].message}`);
29
+ return { document, rows: seq(document.contents ?? undefined, label) };
30
+ }
31
+ function baseRows(value) {
32
+ const document = parseDocument(value, { uniqueKeys: true });
33
+ if (document.errors.length)
34
+ fail(`invalid coordinator base YAML: ${document.errors[0].message}`);
35
+ const result = new Map();
36
+ const operations = seq(document.contents ?? undefined, 'coordinator base');
37
+ for (const operation of operations.items) {
38
+ const item = map(operation, 'coordinator base operation');
39
+ if (item.items.length !== 1 || !item.has('insert'))
40
+ fail('coordinator base contains unsupported operation');
41
+ const inserted = seq(item.get('insert', true), 'coordinator base insert');
42
+ for (const entry of inserted.items) {
43
+ const row = map(entry, 'coordinator base row'), id = row.get('id'), name = row.get('name');
44
+ if (typeof id !== 'string' || typeof name !== 'string' || !id || !name || result.has(id))
45
+ fail('coordinator base has invalid or duplicate id');
46
+ result.set(id, name);
47
+ }
48
+ }
49
+ if (!result.size)
50
+ fail('coordinator base has no rows');
51
+ return result;
52
+ }
53
+ function row(rows, id) { return rows.items.find(item => isMap(item) && item.get('id') === id); }
54
+ function required(rows, id, label = 'profile') {
55
+ const result = row(rows, id);
56
+ if (!result)
57
+ fail(`${label} row ${id} is missing`);
58
+ if (result.get('disabled') === true)
59
+ fail(`${label} row ${id} is disabled`);
60
+ return result;
61
+ }
62
+ function config(item, id) { return map(item.get('config', true), `${id} config`); }
63
+ function json(item, label) {
64
+ const value = item.toJSON();
65
+ if (!value || typeof value !== 'object' || Array.isArray(value))
66
+ fail(`${label} must be an object`);
67
+ return value;
68
+ }
69
+ function text(value, label) { if (typeof value !== 'string' || value.trim() !== value || !value)
70
+ fail(`invalid ${label}`); return value; }
71
+ function profile(value, label) {
72
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(value))
73
+ fail(`invalid ${label}`);
74
+ return value;
75
+ }
76
+ function cloneEffectiveConfig(out, effective, id) {
77
+ const source = config(required(effective.rows, id, 'effective profile'), id);
78
+ let destination = row(out.rows, id);
79
+ if (!destination) {
80
+ destination = map(out.document.createNode({ id }), `${id} override`);
81
+ out.rows.add(destination);
82
+ }
83
+ if (destination.get('disabled') === true)
84
+ fail(`profile row ${id} is disabled`);
85
+ // Preserve YAML tags (notably !!js dshHomePath) by retaining the source node.
86
+ destination.set('config', source);
87
+ return source;
88
+ }
89
+ function replaceNode(document, parent, key, value) { parent.set(key, document.createNode(value)); }
90
+ function upsertById(document, values, value) {
91
+ const index = values.items.findIndex(item => isMap(item) && item.get('id') === value.id);
92
+ if (index < 0)
93
+ values.add(document.createNode(value));
94
+ else
95
+ values.items[index] = document.createNode(value);
96
+ }
97
+ function removePrefixed(values) {
98
+ for (let i = values.items.length - 1; i >= 0; i--) {
99
+ const item = values.items[i];
100
+ if (isMap(item) && typeof item.get('id') === 'string' && item.get('id').startsWith(rsiPrefix))
101
+ values.items.splice(i, 1);
102
+ }
103
+ }
104
+ function absolute(value, label) { if (!isAbsolute(value) || resolve(value) !== value)
105
+ fail(`${label} must be canonical absolute`); return value; }
106
+ function same(value, expected, label) { if (!isDeepStrictEqual(value, expected))
107
+ fail(`${label} does not match owner scope`); }
108
+ function ownerRoute(delivery, owner, routeId, dshHome) {
109
+ const root = json(delivery, 'assistant-delivery config');
110
+ const configuredWorkspace = text(root.defaultWorkspace, 'assistant-delivery.defaultWorkspace');
111
+ const workspace = configuredWorkspace === "dshHomePath('assistant-workspace')" || configuredWorkspace === 'dshHomePath("assistant-workspace")'
112
+ ? join(dshHome, 'assistant-workspace') : absolute(configuredWorkspace, 'assistant-delivery.defaultWorkspace');
113
+ const preset = text(root.defaultAgentPreset, 'assistant-delivery.defaultAgentPreset');
114
+ const principal = externalPrincipalId(owner.principal);
115
+ if (workspace !== owner.workspace || preset !== owner.agentPreset || root.policyRef !== undefined && root.policyRef !== owner.policyRef)
116
+ fail('owner binding differs from effective delivery scope');
117
+ const routes = root.ownerRoutes;
118
+ if (!Array.isArray(routes))
119
+ fail('assistant-delivery.ownerRoutes is missing');
120
+ const candidates = routes.filter((item) => item && typeof item === 'object' && item.id === routeId);
121
+ if (candidates.length !== 1)
122
+ fail('effective delivery has no unique owner route for the owner binding');
123
+ const route = candidates[0];
124
+ // The configured authority is checked field-for-field before it can bind a
125
+ // durable owner receipt. Its minimum generation is a lower bound, not an
126
+ // optional hint.
127
+ for (const key of ['conversation', 'principal', 'workspace', 'agentPreset', 'policyRef']) {
128
+ const expected = key === 'conversation' ? owner.conversation : key === 'principal' ? owner.principal : owner[key];
129
+ same(route[key], expected, `owner route ${key}`);
130
+ }
131
+ if (!Number.isSafeInteger(route.minimumGeneration) || route.minimumGeneration < 1 || owner.generation < route.minimumGeneration)
132
+ fail('owner route minimumGeneration does not match current binding');
133
+ if (owner.generation < 1 || owner.version < 1 || !owner.owner?.id || owner.owner.version < 1)
134
+ fail('owner binding generation or owner receipt is invalid');
135
+ const id = text(route.id, 'owner route id');
136
+ const authority = { id, conversation: owner.conversation, principal: owner.principal, workspace, agentPreset: preset,
137
+ policyRef: owner.policyRef, minimumGeneration: route.minimumGeneration };
138
+ return { workspace, preset, principal, route: { id, authorityHash: ownerRouteAuthorityHash(authority) } };
139
+ }
140
+ function assertManifest(input) {
141
+ if (!input || input.schemaVersion !== 1)
142
+ fail('unsupported manifest schema');
143
+ profile(input.targetProfile, 'targetProfile');
144
+ profile(input.coordinatorProfile, 'coordinatorProfile');
145
+ if (input.targetProfile === input.coordinatorProfile)
146
+ fail('target and coordinator profiles must differ');
147
+ const l = input.limits;
148
+ if (!l || !['periodMs', 'reviews', 'discovery', 'source', 'observations', 'coordinator'].every(key => Object.hasOwn(l, key)) || !Number.isSafeInteger(l.periodMs) || l.periodMs < 1_000 || Object.values(l).some(value => !Number.isSafeInteger(value) || value < 1))
149
+ fail('invalid limits');
150
+ }
151
+ function assertBudget(document, policy, id, limit, periodMs, scope) {
152
+ const budgets = seq(policy.get('budgets', true), 'assistantPolicy.budgets');
153
+ const match = budgets.items.filter(item => isMap(item) && item.get('id') === id);
154
+ if (match.length > 1)
155
+ fail(`duplicate Policy budget ${id}`);
156
+ const globalConflicts = scope === 'global' ? budgets.items.filter(item => isMap(item) && item.get('metric') === 'automation-runs' && item.get('scope') === 'global' && item.get('periodMs') === periodMs && item.get('id') !== id && item.get('limit') !== limit) : [];
157
+ if (globalConflicts.length)
158
+ fail(`global automation-runs budget conflicts with ${id}`);
159
+ upsertById(document, budgets, { id, metric: 'automation-runs', limit, periodMs, scope });
160
+ }
161
+ function targetPolicy(document, personal, manifest, scope, budgetIds) {
162
+ const policy = map(personal.get('assistantPolicy', true), 'assistantPolicy config');
163
+ const automation = map(personal.get('assistantAutomations', true), 'assistantAutomations config');
164
+ if (automation.get('allowUnbudgetedExecution') === true)
165
+ fail('assistantAutomations.allowUnbudgetedExecution must be false');
166
+ automation.set('schedulerEnabled', true);
167
+ assertBudget(document, policy, budgetIds.reviews, manifest.limits.reviews, manifest.limits.periodMs, 'global');
168
+ assertBudget(document, policy, budgetIds.discovery, manifest.limits.discovery, manifest.limits.periodMs, 'subject');
169
+ assertBudget(document, policy, budgetIds.source, manifest.limits.source, manifest.limits.periodMs, 'subject');
170
+ assertBudget(document, policy, budgetIds.observations, manifest.limits.observations, manifest.limits.periodMs, 'subject');
171
+ const rules = seq(policy.get('rules', true), 'assistantPolicy.rules');
172
+ removePrefixed(rules);
173
+ const background = (id, subject, action, automationId) => ({ id: `${rsiPrefix}${id}`, effect: 'allow', subject: { kind: 'background', id: subject, workspace: scope.workspace, principal: scope.principal }, actions: [action], resource: { kind: 'automation', id: automationId }, context: { initiators: ['background'] } });
174
+ for (const [name, subject, automation] of [['usage', 'assistant-growth-usage', 'usage-*'], ['source', 'plugin-control-plane-source', 'source-job-*'], ['observation', 'plugin-control-plane-task-observations', 'task-observation-scan-*']]) {
175
+ upsertById(document, rules, background(`${name}-reconcile`, subject, 'reconcile', automation));
176
+ // Automations execute under their generated automation id; reconciliation
177
+ // runs under its stable owner id.
178
+ upsertById(document, rules, background(`${name}-execute`, automation, 'execute', automation));
179
+ }
180
+ const agent = { kind: 'agent', id: scope.preset, workspace: scope.workspace, principal: scope.principal };
181
+ for (const tool of ['growth_*', 'plugin_source_*'])
182
+ upsertById(document, rules, { id: `${rsiPrefix}${tool}`, effect: 'allow', subject: agent, actions: ['execute'], resource: { kind: 'tool', id: tool }, context: { initiators: ['background'] } });
183
+ upsertById(document, rules, { id: `${rsiPrefix}verified-workflows`, effect: 'allow', subject: agent, actions: ['draft'], resource: { kind: 'evolution', id: 'verified-workflows' }, context: { initiators: ['background'] } });
184
+ }
185
+ /**
186
+ * Read-only profile compiler. The caller owns private manifest I/O, lifecycle locks,
187
+ * atomic writes and post-write DSH composition checks.
188
+ */
189
+ export async function compileRsiProfiles(input) {
190
+ assertManifest(input.manifest);
191
+ absolute(input.dshHome, 'dshHome');
192
+ const target = parse(input.targetPatch, 'target patch'), effective = parse(input.targetEffective, 'target effective config');
193
+ const coordinator = parse(input.coordinatorPatch, 'coordinator patch'), coordinatorEffective = parse(input.coordinatorEffective, 'coordinator effective config');
194
+ for (const id of targetBundles)
195
+ required(effective.rows, id, 'target effective profile');
196
+ const jobs = input.manifest.controlPlane.sourceJobs;
197
+ if (!jobs || jobs.expiresAt <= Date.now())
198
+ fail('sourceJobs must be present and unexpired');
199
+ const delivery = config(required(effective.rows, 'dsh-enhanced-assistant-delivery'), 'assistant-delivery');
200
+ const owner = ownerRoute(delivery, input.owner, jobs.ownerRouteId, input.dshHome);
201
+ if (jobs.ownerRouteId !== owner.route.id || jobs.principalId !== owner.principal || jobs.workspace !== owner.workspace || jobs.preset !== owner.preset)
202
+ fail('sourceJobs does not match effective owner route');
203
+ const growth = normalizeConfig(input.manifest.growthDriver);
204
+ if (!growth.enabled || growth.intervalMs !== 0 || !growth.usageLearning.enabled || !growth.pluginSourceProposals.enabled || growth.pluginSourceProposals.preparationMode !== 'durable' || growth.pluginSourceProposals.repository !== jobs.repository || !growth.scope || !isDeepStrictEqual(growth.scope, { workspace: owner.workspace, preset: owner.preset, principalId: owner.principal, ownerRouteId: owner.route.id }))
205
+ fail('growthDriver must be owner-scoped durable ordinary-use configuration');
206
+ const expectedOwner = { authorityId: jobs.authorityId, authorityHash: owner.route.authorityHash, principalId: owner.principal, principalRecordId: input.owner.owner.id, principalVersion: input.owner.owner.version, workspace: owner.workspace, agentPreset: owner.preset };
207
+ if (!isDeepStrictEqual(input.manifest.sourceReviews.owner, expectedOwner))
208
+ fail('sourceReviews.owner does not match current owner');
209
+ validateSourceReviewConfig(input.manifest.sourceReviews);
210
+ const cp = structuredClone(input.manifest.controlPlane);
211
+ if (!cp.sourceBuild || !cp.sourceApprovals || !cp.sourceReleases || !cp.sourceReleaseExecution || !cp.sourceAdoptions || !cp.runtimeObserver || !cp.foregroundDeployments || !cp.taskObservations)
212
+ fail('target controlPlane lacks a complete source adoption chain');
213
+ if (cp.adoptionCoordinator)
214
+ fail('target controlPlane must not contain adoptionCoordinator');
215
+ if (cp.sourceBuild.versioning !== 'patch')
216
+ fail('sourceBuild requires Host patch versioning');
217
+ if (cp.sourceReleaseExecution.independentReview !== true)
218
+ fail('sourceReleaseExecution requires independentReview');
219
+ if (cp.sourceReleaseExecution.reviewDecisionRoot !== input.manifest.sourceReviews.decisionRoot)
220
+ fail('sourceReviews decisionRoot must equal sourceReleaseExecution reviewDecisionRoot');
221
+ if (cp.sourceAdoptions.profile !== input.manifest.targetProfile || cp.runtimeObserver.profilePath !== join(input.dshHome, 'profiles', input.manifest.targetProfile) || cp.taskObservations.profilePath !== cp.runtimeObserver.profilePath)
222
+ fail('controlPlane profile observation scope differs from target');
223
+ if (!isDeepStrictEqual(cp.taskObservations.scope, { ownerRouteId: owner.route.id, principalId: owner.principal, workspace: owner.workspace, preset: owner.preset }))
224
+ fail('task observation scope differs from source jobs');
225
+ normalizeControlPlaneConfig(cp);
226
+ const budgetIds = { reviews: growth.budgetId, discovery: growth.usageLearning.scanBudgetId, source: jobs.budgetId, observations: cp.taskObservations.budgetId };
227
+ if (Object.values(budgetIds).some((value) => value === null) || new Set(Object.values(budgetIds)).size !== 4 || new Set([...Object.values(budgetIds), input.manifest.coordinator.budgetId]).size !== 5)
228
+ fail('five RSI automation budget ids must be present and distinct');
229
+ const personal = cloneEffectiveConfig(target, effective, 'dsh-enhanced-personal-assistant');
230
+ targetPolicy(target.document, personal, input.manifest, owner, budgetIds);
231
+ const verifier = cloneEffectiveConfig(target, effective, 'dsh-enhanced-assistant-verifier');
232
+ // Keep all existing verifier settings, replacing only the finite review grant.
233
+ replaceNode(target.document, verifier, 'sourceReviews', input.manifest.sourceReviews);
234
+ cloneEffectiveConfig(target, effective, 'dsh-enhanced-assistant-growth-driver');
235
+ replaceNode(target.document, required(target.rows, 'dsh-enhanced-assistant-growth-driver'), 'config', input.manifest.growthDriver);
236
+ cloneEffectiveConfig(target, effective, 'dsh-enhanced-plugin-control-plane');
237
+ replaceNode(target.document, required(target.rows, 'dsh-enhanced-plugin-control-plane'), 'config', cp);
238
+ // Coordinator is intentionally sparse. Base rows must match the installed
239
+ // base patch exactly, while enhanced rows are an explicit three-bundle set.
240
+ const allowedBase = baseRows(input.coordinatorBase);
241
+ const seenCoordinatorRows = new Set();
242
+ for (const item of coordinatorEffective.rows.items) {
243
+ if (!isMap(item))
244
+ fail('coordinator effective config contains non-mapping row');
245
+ const id = item.get('id'), name = item.get('name');
246
+ if (typeof id !== 'string' || typeof name !== 'string' || seenCoordinatorRows.has(id))
247
+ fail('coordinator effective config has invalid or duplicate row');
248
+ seenCoordinatorRows.add(id);
249
+ const expected = coordinatorBundleNames.get(id) ?? allowedBase.get(id);
250
+ if (expected !== name)
251
+ fail(`coordinator contains forbidden row ${id}`);
252
+ const configured = item.get('config', true);
253
+ if (id === 'agent-loop') {
254
+ const agents = map(configured, 'agent-loop config').get('agents', true);
255
+ if (!isSeq(agents) || agents.items.length !== 0)
256
+ fail('coordinator base agent-loop.agents must be empty');
257
+ }
258
+ const nestedPlugins = isMap(configured) ? configured.get('plugins', true) : undefined;
259
+ if (isSeq(nestedPlugins) && nestedPlugins.items.length !== 0)
260
+ fail(`coordinator base row ${id} has nested plugin mounts`);
261
+ }
262
+ for (const id of coordinatorBundles)
263
+ required(coordinatorEffective.rows, id, 'coordinator effective profile');
264
+ const root = join(input.dshHome, 'rsi-coordinators', input.manifest.coordinatorProfile);
265
+ const targetCp = cp;
266
+ const targetAdoptions = targetCp.sourceAdoptions;
267
+ if (!targetAdoptions)
268
+ fail('target sourceAdoptions is required');
269
+ const coordinatorCp = { catalogPath: targetCp.catalogPath, trustPath: targetCp.trustPath, statePath: root,
270
+ adoptionCoordinator: { coordinatorId: targetAdoptions.handoff?.coordinatorId ?? fail('sourceAdoptions.handoff coordinatorId is required'), scope: { workspace: owner.workspace, preset: owner.preset, principalId: owner.principal, ownerRouteId: owner.route.id }, timeoutMs: input.manifest.coordinator.timeoutMs, budgetId: input.manifest.coordinator.budgetId, budgetAmount: input.manifest.coordinator.budgetAmount } };
271
+ normalizeControlPlaneConfig(coordinatorCp);
272
+ const policy = cloneEffectiveConfig(coordinator, coordinatorEffective, 'dsh-enhanced-assistant-policy');
273
+ policy.set('databasePath', join(root, 'policy.sqlite'));
274
+ const budgets = seq(policy.get('budgets', true), 'coordinator policy budgets');
275
+ upsertById(coordinator.document, budgets, { id: input.manifest.coordinator.budgetId, metric: 'automation-runs', limit: input.manifest.limits.coordinator, periodMs: input.manifest.limits.periodMs, scope: 'subject' });
276
+ const rules = seq(policy.get('rules', true), 'coordinator policy rules');
277
+ removePrefixed(rules);
278
+ const coordinatorSubject = { kind: 'background', id: 'plugin-control-plane-adoption-coordinator', workspace: owner.workspace, principal: owner.principal };
279
+ const coordinatorAutomationSubject = { ...coordinatorSubject, id: 'adoption-coordinator-*' };
280
+ upsertById(coordinator.document, rules, { id: `${rsiPrefix}coordinator-reconcile`, effect: 'allow', subject: coordinatorSubject, actions: ['reconcile'], resource: { kind: 'automation', id: 'adoption-coordinator-*' }, context: { initiators: ['background'] } });
281
+ upsertById(coordinator.document, rules, { id: `${rsiPrefix}coordinator-execute`, effect: 'allow', subject: coordinatorAutomationSubject, actions: ['execute'], resource: { kind: 'automation', id: 'adoption-coordinator-*' }, context: { initiators: ['background'] } });
282
+ const automationConfig = cloneEffectiveConfig(coordinator, coordinatorEffective, 'dsh-enhanced-assistant-automations');
283
+ if (automationConfig.get('allowUnbudgetedExecution') === true)
284
+ fail('coordinator allowUnbudgetedExecution must be false');
285
+ automationConfig.set('schedulerEnabled', true);
286
+ automationConfig.set('databasePath', join(root, 'automations.sqlite'));
287
+ automationConfig.set('runsPath', join(root, 'runs'));
288
+ cloneEffectiveConfig(coordinator, coordinatorEffective, 'dsh-enhanced-plugin-control-plane');
289
+ replaceNode(coordinator.document, required(coordinator.rows, 'dsh-enhanced-plugin-control-plane'), 'config', coordinatorCp);
290
+ return { targetPatch: target.document.toString({ lineWidth: 0 }), coordinatorPatch: coordinator.document.toString({ lineWidth: 0 }) };
291
+ }
292
+ //# sourceMappingURL=rsi-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-profile.js","sourceRoot":"","sources":["../src/rsi-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ActiveLarkOwnerBindingsSnapshot } from '@dsh-enhanced/assistant-delivery';
2
+ import { compileRsiProfiles, type RsiSetupManifest } from './rsi-profile.js';
3
+ export declare function assertRsiEffectivePatch(patch: string, effective: string): void;
4
+ export interface RsiSetupArgs {
5
+ manifestPath: string;
6
+ dshHome: string;
7
+ apply: boolean;
8
+ rollback: boolean;
9
+ start: boolean;
10
+ confirmStopped: boolean;
11
+ help: boolean;
12
+ }
13
+ export declare function parseRsiSetupArgs(argv: readonly string[]): RsiSetupArgs;
14
+ export interface RsiSetupPorts {
15
+ dump(profile: string, home: string): string;
16
+ base(profile: string, home: string): Promise<string>;
17
+ snapshot(effective: string, home: string): Promise<ActiveLarkOwnerBindingsSnapshot>;
18
+ compile: typeof compileRsiProfiles;
19
+ validateAuthorities(manifest: RsiSetupManifest, owner: ActiveLarkOwnerBindingsSnapshot['bindings'][number]): Promise<void>;
20
+ assertStopped(profile: string): void;
21
+ start(profile: string, home: string): Promise<void>;
22
+ }
23
+ /** Validate imported finite grants, without calling any signing/authorization method. */
24
+ export declare function validateRsiAuthorities(manifest: RsiSetupManifest, binding: ActiveLarkOwnerBindingsSnapshot['bindings'][number]): Promise<void>;
25
+ export declare function configureRsiSetup(args: RsiSetupArgs, ports?: RsiSetupPorts): Promise<{
26
+ mode: string;
27
+ profiles: readonly string[];
28
+ }>;
29
+ export declare function runRsiSetup(argv?: readonly string[]): Promise<void>;
30
+ //# sourceMappingURL=rsi-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-setup.d.ts","sourceRoot":"","sources":["../src/rsi-setup.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAmB5E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAU9E;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CACjI;AACD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAyBvE;AAwDD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAA;IACnF,OAAO,EAAE,OAAO,kBAAkB,CAAA;IAClC,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1H,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpD;AA6BD,yFAAyF;AACzF,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDpJ;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,GAAE,aAA4B,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAmEvJ;AAED,wBAAsB,WAAW,CAAC,IAAI,GAAE,SAAS,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhG"}
@@ -0,0 +1,364 @@
1
+ import { constants } from 'node:fs';
2
+ import { chmod, lstat, open, realpath, rename, unlink } from 'node:fs/promises';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { createHash, createPublicKey, randomUUID } from 'node:crypto';
5
+ import { homedir } from 'node:os';
6
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
7
+ import { isDeepStrictEqual } from 'node:util';
8
+ import { isMap, isScalar, isSeq, parseDocument } from 'yaml';
9
+ import { compileRsiProfiles } from './rsi-profile.js';
10
+ import { withDshHomeLifecycleLock } from './setup.js';
11
+ import { supervisedGrowthBindingQuery, supervisedGrowthDatabasePaths } from './supervised-growth-profile.js';
12
+ import { installDshResidentService } from './resident.js';
13
+ const MAX_BYTES = 2_097_152;
14
+ const profilePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
15
+ const digest = (value) => createHash('sha256').update(value).digest('hex');
16
+ function fail(message) { throw new Error(`rsi setup: ${message}`); }
17
+ // Compare semantic YAML nodes, including executable !!js tags, without depending
18
+ // on comments or formatting retained by the profile patch serializer.
19
+ function yamlValue(node) {
20
+ if (isScalar(node))
21
+ return { tag: node.tag, value: node.value };
22
+ if (isSeq(node))
23
+ return { tag: node.tag, items: node.items.map(yamlValue) };
24
+ if (isMap(node))
25
+ return { tag: node.tag, entries: node.items.map(item => [yamlValue(item.key), yamlValue(item.value)])
26
+ .sort((left, right) => JSON.stringify(left[0]).localeCompare(JSON.stringify(right[0]))) };
27
+ return node;
28
+ }
29
+ export function assertRsiEffectivePatch(patch, effective) {
30
+ const expected = parseDocument(patch), actual = parseDocument(effective);
31
+ if (expected.errors.length || actual.errors.length || !isSeq(expected.contents) || !isSeq(actual.contents))
32
+ fail('invalid final profile composition');
33
+ for (const row of expected.contents.items) {
34
+ if (!isMap(row) || !row.has('config'))
35
+ continue;
36
+ const matches = actual.contents.items.filter(item => isMap(item) && item.get('id') === row.get('id'));
37
+ const resolved = matches[0];
38
+ if (matches.length !== 1 || !isMap(resolved) || resolved.get('disabled') === true && row.get('disabled') !== true
39
+ || !isDeepStrictEqual(yamlValue(row.get('config', true)), yamlValue(resolved.get('config', true))))
40
+ fail(`effective profile overrides compiled config for ${String(row.get('id'))}`);
41
+ }
42
+ }
43
+ export function parseRsiSetupArgs(argv) {
44
+ const result = { manifestPath: '', dshHome: process.env.DSH_HOME || join(homedir(), '.dsh'),
45
+ apply: false, rollback: false, start: false, confirmStopped: false, help: false };
46
+ const seen = new Set();
47
+ for (let i = 0; i < argv.length; i++) {
48
+ const key = argv[i];
49
+ if (seen.has(key))
50
+ fail(`duplicate option ${key}`);
51
+ seen.add(key);
52
+ if (key === '--help' || key === '-h')
53
+ result.help = true;
54
+ else if (key === '--apply')
55
+ result.apply = true;
56
+ else if (key === '--rollback')
57
+ result.rollback = true;
58
+ else if (key === '--start')
59
+ result.start = true;
60
+ else if (key === '--confirm-hosts-stopped')
61
+ result.confirmStopped = true;
62
+ else if (key === '--manifest' || key === '--dsh-home') {
63
+ const value = argv[++i];
64
+ if (!value || value.startsWith('--'))
65
+ fail(`${key} needs a value`);
66
+ if (key === '--manifest')
67
+ result.manifestPath = resolve(value);
68
+ else
69
+ result.dshHome = value;
70
+ }
71
+ else
72
+ fail(`unknown option ${key}`);
73
+ }
74
+ if (result.help)
75
+ return result;
76
+ if (!result.manifestPath || !isAbsolute(result.dshHome))
77
+ fail('--manifest and absolute DSH_HOME are required');
78
+ if (result.rollback && (result.apply || result.start))
79
+ fail('--rollback cannot be combined with --apply or --start');
80
+ if (result.start && !result.apply)
81
+ fail('--start requires --apply');
82
+ if ((result.apply || result.rollback) && !result.confirmStopped)
83
+ fail('stop both Hosts and pass --confirm-hosts-stopped');
84
+ return result;
85
+ }
86
+ async function readOwnedFile(path, privateFile = true, allowRoot = false) {
87
+ if (!isAbsolute(path) || resolve(path) !== path || await realpath(path) !== path)
88
+ fail(`noncanonical file: ${path}`);
89
+ const descriptor = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
90
+ try {
91
+ const entry = await descriptor.stat(), linked = await lstat(path);
92
+ if (!entry.isFile() || (!allowRoot && entry.nlink !== 1) || (entry.uid !== process.getuid?.() && !(allowRoot && entry.uid === 0)) || entry.size > MAX_BYTES
93
+ || (entry.mode & (privateFile ? 0o077 : 0o022)) !== 0 || linked.ino !== entry.ino || linked.dev !== entry.dev)
94
+ fail(`unsafe file: ${path}`);
95
+ return await descriptor.readFile('utf8');
96
+ }
97
+ finally {
98
+ await descriptor.close();
99
+ }
100
+ }
101
+ async function safeDirectory(path) {
102
+ const entry = await lstat(path);
103
+ if (!entry.isDirectory() || entry.isSymbolicLink() || entry.uid !== process.getuid?.()
104
+ || (entry.mode & 0o022) !== 0 || await realpath(path) !== path)
105
+ fail(`unsafe directory: ${path}`);
106
+ }
107
+ async function syncDirectory(path) {
108
+ const descriptor = await open(path, constants.O_RDONLY);
109
+ try {
110
+ await descriptor.sync();
111
+ }
112
+ finally {
113
+ await descriptor.close();
114
+ }
115
+ }
116
+ async function atomicWrite(path, value) {
117
+ const temporary = `${path}.tmp-${randomUUID()}`;
118
+ const descriptor = await open(temporary, 'wx', 0o600);
119
+ try {
120
+ await descriptor.writeFile(value);
121
+ await descriptor.sync();
122
+ }
123
+ finally {
124
+ await descriptor.close();
125
+ }
126
+ try {
127
+ await rename(temporary, path);
128
+ await chmod(path, 0o600);
129
+ await syncDirectory(dirname(path));
130
+ }
131
+ finally {
132
+ await unlink(temporary).catch(error => { if (error.code !== 'ENOENT')
133
+ throw error; });
134
+ }
135
+ }
136
+ function profiles(manifest) {
137
+ const values = [manifest.targetProfile, manifest.coordinatorProfile];
138
+ if (!values.every(value => typeof value === 'string' && profilePattern.test(value)) || values[0] === values[1])
139
+ fail('profiles must be distinct canonical names');
140
+ return values;
141
+ }
142
+ function patchPath(home, profile) { return join(home, 'profiles', profile, 'cordis.patch.yml'); }
143
+ async function readJournal(path, expected) {
144
+ let content;
145
+ try {
146
+ content = await readOwnedFile(path);
147
+ }
148
+ catch (error) {
149
+ if (error.code === 'ENOENT')
150
+ return undefined;
151
+ throw error;
152
+ }
153
+ const value = JSON.parse(content);
154
+ if (value.schemaVersion !== 1 || !['prepared', 'applied'].includes(value.stage) || !/^[a-f0-9]{64}$/u.test(value.manifestDigest)
155
+ || !Array.isArray(value.entries) || value.entries.length !== 2
156
+ || value.entries.some((entry, index) => entry.profile !== expected[index] || typeof entry.before !== 'string' || typeof entry.after !== 'string'))
157
+ fail('journal does not match this profile pair');
158
+ return value;
159
+ }
160
+ async function rollback(home, journalPath, journal) {
161
+ // Check both files before restoring either. Retry also accepts a half-restored pair.
162
+ for (const entry of journal.entries) {
163
+ const current = await readOwnedFile(patchPath(home, entry.profile), false);
164
+ if (current !== entry.before && current !== entry.after)
165
+ fail('profile changed outside setup; retain journal for reconciliation');
166
+ }
167
+ for (const entry of journal.entries)
168
+ await atomicWrite(patchPath(home, entry.profile), entry.before);
169
+ await unlink(journalPath);
170
+ await syncDirectory(home);
171
+ }
172
+ const defaultPorts = {
173
+ async base(profile, home) {
174
+ // Resolve the installed package symlink, then pin a bounded non-writable file.
175
+ const path = await realpath(join(home, 'profiles', profile, 'node_modules', '@deepseek-ai', 'dsh-base', 'cordis.patch.yml'));
176
+ return readOwnedFile(path, false, true);
177
+ },
178
+ dump(profile, home) {
179
+ const result = spawnSync('dsh', ['--profile', profile, '--dump-config'], { encoding: 'utf8', timeout: 60_000,
180
+ maxBuffer: MAX_BYTES, env: { ...process.env, DSH_HOME: home } });
181
+ if (result.status !== 0 || result.error)
182
+ fail(`cannot compose profile ${profile}`);
183
+ return result.stdout;
184
+ },
185
+ async snapshot(effective, home) {
186
+ const { inspectActiveLarkOwnerBindingsLocally } = await import('@dsh-enhanced/assistant-delivery');
187
+ return inspectActiveLarkOwnerBindingsLocally({ databasePath: supervisedGrowthDatabasePaths(effective, home).deliveryDatabasePath,
188
+ ...supervisedGrowthBindingQuery(effective, home) });
189
+ },
190
+ compile: compileRsiProfiles,
191
+ validateAuthorities: validateRsiAuthorities,
192
+ assertStopped(profile) {
193
+ const result = spawnSync('systemctl', ['--user', 'show', `dsh-profile-${profile}.service`, '--property=ActiveState', '--value'], { encoding: 'utf8', timeout: 10_000, maxBuffer: 65_536 });
194
+ if (result.status !== 0 || result.error || !['inactive', 'failed'].includes(result.stdout.trim()))
195
+ fail(`systemd profile ${profile} must be stopped`);
196
+ },
197
+ async start(profile, home) { await installDshResidentService({ dshHome: home, profile }); },
198
+ };
199
+ /** Validate imported finite grants, without calling any signing/authorization method. */
200
+ export async function validateRsiAuthorities(manifest, binding) {
201
+ const cp = await import('@dsh-enhanced/plugin-control-plane');
202
+ const config = manifest.controlPlane;
203
+ if (!config.sourceJobs || !config.sourceApprovals || !config.sourceReleases || !config.sourceAdoptions || !config.taskObservations)
204
+ fail('source authority chain is incomplete');
205
+ const approvals = JSON.parse(await readOwnedFile(config.sourceApprovals.configPath));
206
+ const releases = JSON.parse(await readOwnedFile(config.sourceReleases.configPath));
207
+ const adoptions = JSON.parse(await readOwnedFile(config.sourceAdoptions.authority.configPath));
208
+ const observations = JSON.parse(await readOwnedFile(config.taskObservations.authority.configPath));
209
+ cp.validateSourceApprovalAuthorityConfig(approvals);
210
+ cp.validateSourceReleaseAuthorityConfig(releases);
211
+ cp.validateSourceAdoptionAuthorityConfig(adoptions);
212
+ cp.validateTaskObservationAuthorityConfig(observations);
213
+ const expectedOwner = manifest.sourceReviews.owner;
214
+ if (expectedOwner.principalRecordId !== binding.owner.id || expectedOwner.principalVersion !== binding.owner.version)
215
+ fail('grant owner has changed');
216
+ const trust = await cp.loadTrustConfig(config.trustPath);
217
+ if (trust.schemaVersion !== 4 || !trust.hostAttestor || !trust.releaseAdapters
218
+ || ['pr', 'review', 'merge', 'build', 'sign', 'publish', 'registry-verify', 'catalog-admission'].some(phase => !Object.hasOwn(trust.releaseAdapters, phase)))
219
+ fail('complete release and Host attestation adapters are required');
220
+ const ledgerPath = join(config.statePath, 'control.sqlite');
221
+ const { id, version, path, sha256 } = trust.executor;
222
+ for (const authority of [approvals, releases, adoptions, observations]) {
223
+ if (authority.controlDatabasePath !== ledgerPath || !isDeepStrictEqual(authority.grant.owner, expectedOwner))
224
+ fail('authority owner/ledger mismatch');
225
+ }
226
+ if (trust.ledger.path !== ledgerPath || adoptions.grant.ledger.path !== ledgerPath
227
+ || !isDeepStrictEqual(adoptions.grant.ledger, trust.ledger) || adoptions.grant.installationId !== trust.installationId
228
+ || adoptions.grant.target.dshHome !== trust.dshHome || trust.catalog.path !== config.catalogPath
229
+ || adoptions.grant.target.profile !== manifest.targetProfile || adoptions.grant.target.profilePath !== config.runtimeObserver?.profilePath
230
+ || adoptions.grant.target.profilePath !== join(trust.dshHome, 'profiles', manifest.targetProfile)
231
+ || !isDeepStrictEqual(adoptions.grant.executor, { id, version, path, sha256 })
232
+ || adoptions.grant.catalogPath !== config.catalogPath || !isDeepStrictEqual(adoptions.grant.handoff, config.sourceAdoptions.handoff)
233
+ || approvals.grant.repository !== config.sourceJobs.repository || releases.grant.repository !== config.sourceJobs.repository
234
+ || approvals.grant.worktreeRoot !== join(config.statePath, 'source-worktrees') || releases.grant.worktreeRoot !== approvals.grant.worktreeRoot
235
+ || approvals.grant.versioning !== 'patch' || releases.grant.versioning !== 'patch'
236
+ || !isDeepStrictEqual(observations.grant.policy, config.taskObservations.policy)
237
+ || observations.grant.profilePath !== config.taskObservations.profilePath
238
+ || observations.grant.installationId !== trust.installationId || !isDeepStrictEqual(observations.grant.ledger, trust.ledger))
239
+ fail('authority deployment terms mismatch');
240
+ const selected = [...approvals.grant.plugins].sort();
241
+ if (!isDeepStrictEqual([...observations.grant.packages].sort(), selected.map(plugin => `@dsh-enhanced/${plugin}`)))
242
+ fail('observation package allowlist does not match');
243
+ for (const plugins of [releases.grant.plugins, adoptions.grant.policies.map(policy => policy.candidateId), manifest.sourceReviews.plugins]) {
244
+ if (!isDeepStrictEqual(selected, [...plugins].sort()))
245
+ fail('authority plugin allowlists do not match');
246
+ }
247
+ for (const policy of adoptions.grant.policies) {
248
+ const release = releases.grant.policies.find(item => item.candidateId === policy.candidateId);
249
+ if (!release || release.catalogId !== trust.catalog.id || release.catalogPath !== trust.catalog.path
250
+ || Object.entries(policy).some(([key, value]) => !isDeepStrictEqual(value, release[key])))
251
+ fail('release and adoption policies do not match');
252
+ }
253
+ for (const [authority, purpose] of [[approvals, 'approval'], [adoptions, 'approval'], [releases, 'release-authorization'], [observations, 'host-attestation']]) {
254
+ const trusted = cp.resolveTrustKey(trust, purpose, authority.authority, authority.keyId);
255
+ const configured = createPublicKey(await readOwnedFile(authority.keyPath)).export({ type: 'spki', format: 'der' });
256
+ const registered = createPublicKey(trusted.publicKeyPem).export({ type: 'spki', format: 'der' });
257
+ if (!configured.equals(registered))
258
+ fail('authority key does not match registered trust');
259
+ }
260
+ if ([approvals.grant.expiresAt, releases.grant.expiresAt, adoptions.grant.expiresAt, observations.grant.policy.expiresAt,
261
+ manifest.sourceReviews.expiresAt].some(value => value <= Date.now()))
262
+ fail('finite authority has expired');
263
+ }
264
+ export async function configureRsiSetup(args, ports = defaultPorts) {
265
+ if (process.platform !== 'linux')
266
+ fail('dual Host setup currently requires Linux systemd user services');
267
+ if (args.rollback && (args.apply || args.start) || args.start && !args.apply)
268
+ fail('incompatible setup operations');
269
+ const home = args.dshHome;
270
+ await safeDirectory(home);
271
+ const manifestBytes = await readOwnedFile(args.manifestPath);
272
+ const manifest = JSON.parse(manifestBytes);
273
+ const pair = profiles(manifest);
274
+ return withDshHomeLifecycleLock(home, async () => {
275
+ for (const profile of pair)
276
+ await safeDirectory(join(home, 'profiles', profile));
277
+ const journalPath = join(home, '.rsi-setup-journal.json');
278
+ const previous = await readJournal(journalPath, pair);
279
+ if (args.apply || args.rollback) {
280
+ if (!args.confirmStopped)
281
+ fail('both Hosts must be stopped');
282
+ for (const profile of pair)
283
+ ports.assertStopped(profile);
284
+ }
285
+ if (args.rollback) {
286
+ if (!previous)
287
+ fail('no setup journal to roll back');
288
+ await rollback(home, journalPath, previous);
289
+ return { mode: 'rolled-back', profiles: pair };
290
+ }
291
+ if (previous?.stage === 'prepared')
292
+ fail('interrupted setup; use --rollback before continuing');
293
+ const original = await Promise.all(pair.map(profile => readOwnedFile(patchPath(home, profile), false)));
294
+ const effective = pair.map(profile => ports.dump(profile, home));
295
+ const coordinatorBase = await ports.base(pair[1], home);
296
+ const snapshot = await ports.snapshot(effective[0], home);
297
+ if (snapshot.bindings.length !== 1)
298
+ fail('exactly one active owner DM binding is required');
299
+ const owner = snapshot.bindings[0];
300
+ const input = { manifest, dshHome: home, targetPatch: original[0], coordinatorPatch: original[1],
301
+ targetEffective: effective[0], coordinatorEffective: effective[1], coordinatorBase, owner };
302
+ const compiled = await ports.compile(input);
303
+ await ports.validateAuthorities(manifest, owner);
304
+ if (!args.apply)
305
+ return { mode: 'checked', profiles: pair };
306
+ if (await readOwnedFile(args.manifestPath) !== manifestBytes || await ports.base(pair[1], home) !== coordinatorBase
307
+ || !isDeepStrictEqual(snapshot, await ports.snapshot(effective[0], home)))
308
+ fail('manifest or owner snapshot changed before write');
309
+ for (let i = 0; i < pair.length; i++) {
310
+ ports.assertStopped(pair[i]);
311
+ if (await readOwnedFile(patchPath(home, pair[i]), false) !== original[i])
312
+ fail('profile changed before write');
313
+ }
314
+ const next = [compiled.targetPatch, compiled.coordinatorPatch];
315
+ if (previous && previous.entries.some((entry, i) => entry.after !== original[i]))
316
+ fail('profile changed since previous setup; reconcile its journal first');
317
+ const journal = { schemaVersion: 1, manifestDigest: digest(manifestBytes), stage: 'prepared',
318
+ entries: pair.map((profile, i) => ({ profile, before: original[i], after: next[i] })) };
319
+ if (Buffer.byteLength(JSON.stringify(journal)) > MAX_BYTES)
320
+ fail('combined profile journal exceeds setup size limit');
321
+ const unchanged = next.every((value, i) => value === original[i]);
322
+ if (unchanged)
323
+ for (let i = 0; i < pair.length; i++)
324
+ assertRsiEffectivePatch(next[i], effective[i]);
325
+ if (!unchanged) {
326
+ await atomicWrite(journalPath, JSON.stringify(journal));
327
+ try {
328
+ for (const entry of journal.entries)
329
+ await atomicWrite(patchPath(home, entry.profile), entry.after);
330
+ const final = pair.map(profile => ports.dump(profile, home));
331
+ for (let i = 0; i < pair.length; i++)
332
+ assertRsiEffectivePatch(next[i], final[i]);
333
+ const recompiled = await ports.compile({ ...input, targetPatch: next[0], coordinatorPatch: next[1],
334
+ targetEffective: final[0], coordinatorEffective: final[1] });
335
+ if (!isDeepStrictEqual(recompiled, compiled))
336
+ fail('effective profile differs from the compiled deployment');
337
+ journal.stage = 'applied';
338
+ await atomicWrite(journalPath, JSON.stringify(journal));
339
+ }
340
+ catch (error) {
341
+ await rollback(home, journalPath, journal);
342
+ if (previous)
343
+ await atomicWrite(journalPath, JSON.stringify(previous));
344
+ throw error;
345
+ }
346
+ }
347
+ // Starting is explicit and follows successful composition of both profiles.
348
+ // A failed start retains the applied journal; it never rewrites a live Host.
349
+ if (args.start) {
350
+ await ports.start(pair[1], home);
351
+ await ports.start(pair[0], home);
352
+ }
353
+ return { mode: args.start ? 'services-started' : 'configured', profiles: pair };
354
+ });
355
+ }
356
+ export async function runRsiSetup(argv = process.argv.slice(2)) {
357
+ const args = parseRsiSetupArgs(argv);
358
+ if (args.help) {
359
+ process.stdout.write('Usage: dsh-rsi-setup --manifest <private.json> [--dsh-home <absolute>] [--apply --confirm-hosts-stopped [--start] | --rollback --confirm-hosts-stopped]\nDefault: validate installed profiles and finite authority configuration without changing profiles.\n');
360
+ return;
361
+ }
362
+ process.stdout.write(`${JSON.stringify(await configureRsiSetup(args))}\n`);
363
+ }
364
+ //# sourceMappingURL=rsi-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-setup.js","sourceRoot":"","sources":["../src/rsi-setup.ts"],"names":[],"mappings":"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"}
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "0.1.32";
1
+ export declare const version = "0.1.34";
2
2
  //# sourceMappingURL=version.d.ts.map
package/lib/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '0.1.32';
1
+ export const version = '0.1.34';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-enhanced/lark-channel",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "description": "A thin Feishu/Lark WebSocket adapter for the durable DSH assistant-delivery core.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -8,7 +8,8 @@
8
8
  "types": "./lib/index.d.ts",
9
9
  "bin": {
10
10
  "dsh-lark-setup": "./bin/dsh-lark-setup.js",
11
- "dsh-supervised-growth-setup": "./bin/dsh-supervised-growth-setup.js"
11
+ "dsh-supervised-growth-setup": "./bin/dsh-supervised-growth-setup.js",
12
+ "dsh-rsi-setup": "./bin/dsh-rsi-setup.js"
12
13
  },
13
14
  "exports": {
14
15
  ".": {
@@ -66,7 +67,11 @@
66
67
  "@dsh-enhanced/assistant-recovery": ">0.1.7 <0.2.0",
67
68
  "@dsh-enhanced/credentials-keychain": ">=0.1.0 <0.2.0",
68
69
  "@dsh-enhanced/personal-assistant": ">0.1.7 <0.2.0",
69
- "@dsh-enhanced/preference-learning": ">0.1.7 <0.2.0"
70
+ "@dsh-enhanced/preference-learning": ">0.1.7 <0.2.0",
71
+ "@dsh-enhanced/assistant-growth-driver": ">=0.1.0 <0.2.0",
72
+ "@dsh-enhanced/plugin-control-plane": ">=0.1.33 <0.2.0",
73
+ "@dsh-enhanced/assistant-verifier": ">=0.1.33 <0.2.0",
74
+ "@dsh-enhanced/assistant-policy": ">=0.1.33 <0.2.0"
70
75
  },
71
76
  "peerDependenciesMeta": {
72
77
  "@deepseek-ai/cordis": {
@@ -104,6 +109,18 @@
104
109
  },
105
110
  "@dsh-enhanced/preference-learning": {
106
111
  "optional": true
112
+ },
113
+ "@dsh-enhanced/assistant-growth-driver": {
114
+ "optional": true
115
+ },
116
+ "@dsh-enhanced/plugin-control-plane": {
117
+ "optional": true
118
+ },
119
+ "@dsh-enhanced/assistant-verifier": {
120
+ "optional": true
121
+ },
122
+ "@dsh-enhanced/assistant-policy": {
123
+ "optional": true
107
124
  }
108
125
  },
109
126
  "devDependencies": {
@@ -113,17 +130,21 @@
113
130
  "@types/qrcode": "1.5.6",
114
131
  "typescript": "6.0.3",
115
132
  "vitest": "4.1.8",
116
- "@dsh-enhanced/assistant-evaluation": "0.1.32",
117
- "@dsh-enhanced/assistant-growth-experiments": "0.1.32",
118
- "@dsh-enhanced/assistant-delivery": "0.1.32",
119
- "@dsh-enhanced/assistant-evolution": "0.1.32",
120
- "@dsh-enhanced/assistant-automations": "0.1.32",
121
- "@dsh-enhanced/assistant-health": "0.1.32",
122
- "@dsh-enhanced/assistant-heartbeat": "0.1.32",
123
- "@dsh-enhanced/credentials-keychain": "0.1.32",
124
- "@dsh-enhanced/personal-assistant": "0.1.32",
125
- "@dsh-enhanced/assistant-recovery": "0.1.32",
126
- "@dsh-enhanced/preference-learning": "0.1.32"
133
+ "@dsh-enhanced/assistant-automations": "0.1.34",
134
+ "@dsh-enhanced/assistant-delivery": "0.1.34",
135
+ "@dsh-enhanced/assistant-evaluation": "0.1.34",
136
+ "@dsh-enhanced/assistant-evolution": "0.1.34",
137
+ "@dsh-enhanced/assistant-growth-experiments": "0.1.34",
138
+ "@dsh-enhanced/assistant-health": "0.1.34",
139
+ "@dsh-enhanced/assistant-heartbeat": "0.1.34",
140
+ "@dsh-enhanced/assistant-recovery": "0.1.34",
141
+ "@dsh-enhanced/credentials-keychain": "0.1.34",
142
+ "@dsh-enhanced/personal-assistant": "0.1.34",
143
+ "@dsh-enhanced/preference-learning": "0.1.34",
144
+ "@dsh-enhanced/assistant-growth-driver": "0.1.34",
145
+ "@dsh-enhanced/plugin-control-plane": "0.1.34",
146
+ "@dsh-enhanced/assistant-policy": "0.1.34",
147
+ "@dsh-enhanced/assistant-verifier": "0.1.34"
127
148
  },
128
149
  "scripts": {
129
150
  "build": "tsc -p tsconfig.build.json",