@dsh-enhanced/assistant-web-owner 0.1.30
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 +226 -0
- package/bin/dsh-autonomy-doctor.js +7 -0
- package/bin/dsh-web-owner-setup.js +7 -0
- package/cordis.patch.yml +6 -0
- package/lib/THIRD_PARTY_LICENSES +23 -0
- package/lib/autonomy.d.ts +22 -0
- package/lib/autonomy.d.ts.map +1 -0
- package/lib/autonomy.js +267 -0
- package/lib/autonomy.js.map +1 -0
- package/lib/client.d.ts +1 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +17418 -0
- package/lib/client.js.map +1 -0
- package/lib/doctor.d.ts +22 -0
- package/lib/doctor.d.ts.map +1 -0
- package/lib/doctor.js +159 -0
- package/lib/doctor.js.map +1 -0
- package/lib/goal-admission.d.ts +94 -0
- package/lib/goal-admission.d.ts.map +1 -0
- package/lib/goal-admission.js +553 -0
- package/lib/goal-admission.js.map +1 -0
- package/lib/goal-setup.d.ts +15 -0
- package/lib/goal-setup.d.ts.map +1 -0
- package/lib/goal-setup.js +145 -0
- package/lib/goal-setup.js.map +1 -0
- package/lib/index.d.ts +42 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +200 -0
- package/lib/index.js.map +1 -0
- package/lib/notices.d.ts +11 -0
- package/lib/notices.d.ts.map +1 -0
- package/lib/notices.js +13 -0
- package/lib/notices.js.map +1 -0
- package/lib/repair-setup.d.ts +50 -0
- package/lib/repair-setup.d.ts.map +1 -0
- package/lib/repair-setup.js +165 -0
- package/lib/repair-setup.js.map +1 -0
- package/lib/setup.d.ts +24 -0
- package/lib/setup.d.ts.map +1 -0
- package/lib/setup.js +302 -0
- package/lib/setup.js.map +1 -0
- package/lib/typert.d.ts +83 -0
- package/lib/typert.d.ts.map +1 -0
- package/lib/typert.js +37 -0
- package/lib/typert.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 +181 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type WebOwnerSetupInput } from './setup.js';
|
|
2
|
+
type RepairProfile = {
|
|
3
|
+
id: string;
|
|
4
|
+
scope: {
|
|
5
|
+
principalId: string;
|
|
6
|
+
principalRecordId: string;
|
|
7
|
+
principalVersion: number;
|
|
8
|
+
workspace: string;
|
|
9
|
+
preset: string;
|
|
10
|
+
};
|
|
11
|
+
skillName: string;
|
|
12
|
+
taskFamilyId: string;
|
|
13
|
+
description: string;
|
|
14
|
+
externalHoldoutProfileId: string;
|
|
15
|
+
provider: string;
|
|
16
|
+
model: string;
|
|
17
|
+
allowedTools: string[];
|
|
18
|
+
maxGoalRounds: number;
|
|
19
|
+
maxModelCalls: number;
|
|
20
|
+
maxToolCalls: number;
|
|
21
|
+
maxOutputTokens: number;
|
|
22
|
+
maxDurationMs: number;
|
|
23
|
+
canaryRuns: number;
|
|
24
|
+
maxCanaryRuns: number;
|
|
25
|
+
maxIterations?: number;
|
|
26
|
+
followupProfileIds?: string[];
|
|
27
|
+
bindings?: unknown[];
|
|
28
|
+
};
|
|
29
|
+
export type RepairAdmissionTask = {
|
|
30
|
+
repairProfiles: RepairProfile[];
|
|
31
|
+
externalHoldouts: unknown[];
|
|
32
|
+
ownerRouteId: string;
|
|
33
|
+
};
|
|
34
|
+
/** Strict private operator input. It contains no task, source Goal, credentials, or evaluator cases. */
|
|
35
|
+
export declare function parseRepairAdmissionTask(source: string): RepairAdmissionTask;
|
|
36
|
+
export declare function prepareRepairAdmission(input: WebOwnerSetupInput, source: string, effective: string, taskSource: string): {
|
|
37
|
+
patch: string;
|
|
38
|
+
id: string;
|
|
39
|
+
databasePath: string;
|
|
40
|
+
owner: {
|
|
41
|
+
id: string;
|
|
42
|
+
version: number;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export declare function configureRepairAdmission(input: WebOwnerSetupInput, effective: string, taskPath: string, reread?: () => Promise<string>): Promise<{
|
|
46
|
+
path: string;
|
|
47
|
+
id: string;
|
|
48
|
+
}>;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=repair-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-setup.d.ts","sourceRoot":"","sources":["../src/repair-setup.ts"],"names":[],"mappings":"AAQA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAO5E,KAAK,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AAChiB,MAAM,MAAM,mBAAmB,GAAG;IAAE,cAAc,EAAE,aAAa,EAAE,CAAC;IAAC,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAA;AAKxH,wGAAwG;AACxG,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAO5E;AAeD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CA4BpN;AAKD,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAKpL"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { lstat, mkdir, open, readFile, realpath, rename, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { isAbsolute, join, relative, sep } from 'node:path';
|
|
5
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
6
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
7
|
+
import { isMap, isSeq, parseDocument } from 'yaml';
|
|
8
|
+
import * as Skills from '@dsh-enhanced/assistant-skills';
|
|
9
|
+
import { prepareWebOwnerProfile } from './setup.js';
|
|
10
|
+
function fail(reason) { throw new Error(`repair setup: ${reason}`); }
|
|
11
|
+
const { validateExternalHoldoutProfiles, validateRepairProfiles } = Skills;
|
|
12
|
+
const plain = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
13
|
+
const text = (value, limit) => typeof value === 'string' && value.length > 0 && value.length <= limit && !value.includes('\0');
|
|
14
|
+
const integer = (value, min, max) => Number.isSafeInteger(value) && Number(value) >= min && Number(value) <= max;
|
|
15
|
+
/** Strict private operator input. It contains no task, source Goal, credentials, or evaluator cases. */
|
|
16
|
+
export function parseRepairAdmissionTask(source) {
|
|
17
|
+
let value;
|
|
18
|
+
try {
|
|
19
|
+
value = JSON.parse(source);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
fail('admission file must be JSON');
|
|
23
|
+
}
|
|
24
|
+
if (!plain(value) || Object.keys(value).sort().join(',') !== 'externalHoldouts,ownerRouteId,repairProfiles' || !Array.isArray(value.repairProfiles) || value.repairProfiles.length < 1 || value.repairProfiles.length > 4 || !Array.isArray(value.externalHoldouts) || !text(value.ownerRouteId, 4096))
|
|
25
|
+
fail('admission fields are invalid');
|
|
26
|
+
for (const p of value.repairProfiles) {
|
|
27
|
+
if (!plain(p) || !plain(p.scope) || Object.keys(p).some(key => !['id', 'scope', 'skillName', 'taskFamilyId', 'description', 'externalHoldoutProfileId', 'provider', 'model', 'allowedTools', 'maxGoalRounds', 'maxModelCalls', 'maxToolCalls', 'maxOutputTokens', 'maxDurationMs', 'canaryRuns', 'maxCanaryRuns', 'maxIterations', 'followupProfileIds', 'bindings'].includes(key)) || Object.keys(p.scope).sort().join(',') !== 'preset,principalId,principalRecordId,principalVersion,workspace' || ![p.id, p.skillName, p.taskFamilyId, p.description, p.externalHoldoutProfileId, p.provider, p.model, p.scope.principalId, p.scope.principalRecordId, p.scope.workspace, p.scope.preset].every(item => text(item, 4096)) || !isAbsolute(p.scope.workspace) || !Array.isArray(p.allowedTools) || p.allowedTools.length < 1 || p.allowedTools.some(item => !text(item, 128) || /^(?:skill_|goal_create$|goal_control$|set_goal$|update_goal$)/u.test(item)) || !integer(p.scope.principalVersion, 1, Number.MAX_SAFE_INTEGER) || !integer(p.maxGoalRounds, 1, 32) || !integer(p.maxModelCalls, 1, 128) || !integer(p.maxToolCalls, 1, 512) || !integer(p.maxOutputTokens, 1, 65536) || !integer(p.maxDurationMs, 1000, 300000) || !integer(p.canaryRuns, 1, 32) || !integer(p.maxCanaryRuns, p.canaryRuns, 100) || (p.maxIterations !== undefined && !integer(p.maxIterations, 1, 4)) || (p.followupProfileIds !== undefined && (!Array.isArray(p.followupProfileIds) || p.followupProfileIds.length > Number(p.maxIterations ?? 1) - 1 || p.followupProfileIds.some(id => !text(id, 128)))) || (p.bindings !== undefined && !Array.isArray(p.bindings)))
|
|
28
|
+
fail('repair profile is invalid or exceeds fixed authority');
|
|
29
|
+
}
|
|
30
|
+
return structuredClone(value);
|
|
31
|
+
}
|
|
32
|
+
function config(rows, id) {
|
|
33
|
+
const found = rows.items.filter(item => isMap(item) && item.get('id') === id);
|
|
34
|
+
if (found.length !== 1 || !found[0].has('config') || !isMap(found[0].get('config', true)))
|
|
35
|
+
fail(`require one configured ${id}`);
|
|
36
|
+
return found[0].get('config', true);
|
|
37
|
+
}
|
|
38
|
+
function owner(databasePath, account) {
|
|
39
|
+
const database = new DatabaseSync(databasePath, { readOnly: true });
|
|
40
|
+
try {
|
|
41
|
+
const rows = database.prepare("SELECT id, principal_json, role, status, version FROM delivery_principals WHERE role='owner' AND status='active'").all();
|
|
42
|
+
const matches = rows.filter(row => row.role === 'owner' && row.status === 'active' && text(row.id, 4096) && integer(row.version, 1, Number.MAX_SAFE_INTEGER) && (() => { try {
|
|
43
|
+
const principal = JSON.parse(String(row.principal_json));
|
|
44
|
+
return principal?.channel === 'web' && principal.account === account && principal.tenant === 'local' && principal.user === 'operator';
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
} })());
|
|
49
|
+
if (matches.length !== 1)
|
|
50
|
+
fail('current Web owner is unavailable');
|
|
51
|
+
return { id: matches[0].id, version: matches[0].version };
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
database.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function prepareRepairAdmission(input, source, effective, taskSource) {
|
|
58
|
+
if (typeof validateExternalHoldoutProfiles !== 'function' || typeof validateRepairProfiles !== 'function')
|
|
59
|
+
fail('matching assistant-skills validator exports are required');
|
|
60
|
+
const base = prepareWebOwnerProfile(input, source, effective);
|
|
61
|
+
const task = parseRepairAdmissionTask(taskSource);
|
|
62
|
+
const doc = parseDocument(base.patch);
|
|
63
|
+
if (doc.errors.length || !isSeq(doc.contents))
|
|
64
|
+
fail('prepared patch is not a sequence');
|
|
65
|
+
const rows = doc.contents;
|
|
66
|
+
const skills = config(rows, 'dsh-enhanced-assistant-skills');
|
|
67
|
+
const delivery = config(rows, 'dsh-enhanced-assistant-delivery');
|
|
68
|
+
const goals = config(rows, 'dsh-enhanced-assistant-goals');
|
|
69
|
+
const verifier = config(rows, 'dsh-enhanced-assistant-verifier');
|
|
70
|
+
const current = owner(base.databasePath, input.profile);
|
|
71
|
+
const principalId = `web/${input.profile}/local/operator`;
|
|
72
|
+
if (task.repairProfiles.some(({ scope }) => scope.principalId !== principalId || scope.principalRecordId !== current.id || scope.principalVersion !== current.version || scope.workspace !== input.workspace || scope.preset !== input.preset))
|
|
73
|
+
fail('repair profile scope does not match the current owner');
|
|
74
|
+
const routes = delivery.get('ownerRoutes', true);
|
|
75
|
+
const execution = goals.get('executionBudget', true);
|
|
76
|
+
const profiles = verifier.get('profiles', true);
|
|
77
|
+
const executionRoutes = isMap(execution) ? execution.get('routes', true) : undefined;
|
|
78
|
+
if (!isSeq(routes) || !routes.items.some(item => isMap(item) && item.get('id') === task.ownerRouteId && item.get('workspace') === input.workspace && item.get('agentPreset') === input.preset) || !isMap(execution) || execution.get('mode') !== 'calls' || !integer(execution.get('modelCalls'), 1, 128) || !integer(execution.get('toolCalls'), 1, 512) || !integer(execution.get('durationMs'), 1_000, 300_000) || !integer(execution.get('maxOutputTokensPerCall'), 1, 65536) || !isSeq(executionRoutes) || task.repairProfiles.some(profile => profile.maxModelCalls > Number(execution.get('modelCalls')) || profile.maxToolCalls > Number(execution.get('toolCalls')) || profile.maxDurationMs > Number(execution.get('durationMs')) || profile.maxOutputTokens > Number(execution.get('maxOutputTokensPerCall')) || !executionRoutes.items.some(route => isMap(route) && route.get('provider') === profile.provider && route.get('model') === profile.model)) || profiles === undefined)
|
|
79
|
+
fail('current owner route, finite Goals execution budget, exact model route, or Verifier profiles are missing');
|
|
80
|
+
let holdouts = skills.get('externalHoldouts', true);
|
|
81
|
+
if (holdouts === undefined) {
|
|
82
|
+
holdouts = doc.createNode([]);
|
|
83
|
+
skills.set('externalHoldouts', holdouts);
|
|
84
|
+
}
|
|
85
|
+
if (!isSeq(holdouts))
|
|
86
|
+
fail('externalHoldouts must be a sequence');
|
|
87
|
+
// Validate the complete post-merge value with the published Skills contract
|
|
88
|
+
// before changing the YAML document. This is the admission gate, not a
|
|
89
|
+
// deferred runtime failure.
|
|
90
|
+
const existingHoldouts = holdouts.items.map(item => item?.toJSON());
|
|
91
|
+
const nextHoldouts = validateExternalHoldoutProfiles([...existingHoldouts, ...task.externalHoldouts.filter(value => !existingHoldouts.some(old => plain(old) && plain(value) && old.id === value.id))]);
|
|
92
|
+
const existingRepair = skills.get('repairProfiles', true);
|
|
93
|
+
const existingProfiles = isSeq(existingRepair) ? existingRepair.items.map(item => item?.toJSON()) : [];
|
|
94
|
+
validateRepairProfiles([...existingProfiles, ...task.repairProfiles.filter(value => !existingProfiles.some(old => plain(old) && old.id === value.id))], nextHoldouts);
|
|
95
|
+
for (const value of task.externalHoldouts) {
|
|
96
|
+
const id = plain(value) ? value.id : undefined;
|
|
97
|
+
const same = holdouts.items.filter(item => isMap(item) && item.get('id') === id);
|
|
98
|
+
if (same.length > 1 || (same[0] && !isDeepStrictEqual(same[0].toJSON(), value)))
|
|
99
|
+
fail('holdout conflicts with existing configuration');
|
|
100
|
+
if (!same[0])
|
|
101
|
+
holdouts.add(doc.createNode(value));
|
|
102
|
+
}
|
|
103
|
+
let repair = skills.get('repairProfiles', true);
|
|
104
|
+
if (repair === undefined) {
|
|
105
|
+
repair = doc.createNode([]);
|
|
106
|
+
skills.set('repairProfiles', repair);
|
|
107
|
+
}
|
|
108
|
+
if (!isSeq(repair))
|
|
109
|
+
fail('repairProfiles must be a sequence');
|
|
110
|
+
for (const value of task.repairProfiles) {
|
|
111
|
+
const same = repair.items.filter(item => isMap(item) && item.get('id') === value.id);
|
|
112
|
+
if (same.length > 1 || (same[0] && !isDeepStrictEqual(same[0].toJSON(), value)))
|
|
113
|
+
fail('repair profile conflicts with existing configuration');
|
|
114
|
+
if (!same[0])
|
|
115
|
+
repair.add(doc.createNode(value));
|
|
116
|
+
}
|
|
117
|
+
return { patch: doc.toString({ lineWidth: 0 }), id: task.repairProfiles.map(value => value.id).join(', '), databasePath: base.databasePath, owner: current };
|
|
118
|
+
}
|
|
119
|
+
async function privateJson(path, workspace) {
|
|
120
|
+
if (!isAbsolute(path) || await realpath(path) !== path || await realpath(workspace) !== workspace || (relative(workspace, path) !== '..' && !relative(workspace, path).startsWith(`..${sep}`) && !isAbsolute(relative(workspace, path))))
|
|
121
|
+
fail('use a canonical private admission path outside the workspace');
|
|
122
|
+
const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
123
|
+
try {
|
|
124
|
+
const stat = await file.stat();
|
|
125
|
+
if (!stat.isFile() || stat.uid !== process.getuid?.() || (stat.mode & 0o077) || stat.size > 1024 * 1024)
|
|
126
|
+
fail('admission file must be private, owned, regular and at most 1 MiB');
|
|
127
|
+
return await file.readFile({ encoding: 'utf8' });
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
await file.close();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export async function configureRepairAdmission(input, effective, taskPath, reread) {
|
|
134
|
+
const directory = join(input.dshHome, 'profiles', input.profile);
|
|
135
|
+
if (!(await lstat(directory)).isDirectory())
|
|
136
|
+
fail('install the target profile first');
|
|
137
|
+
const task = await privateJson(taskPath, input.workspace);
|
|
138
|
+
const lock = join(directory, '.assistant-web-owner-setup.lock');
|
|
139
|
+
try {
|
|
140
|
+
await mkdir(lock, { mode: 0o700 });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
fail('another setup holds the profile lock');
|
|
144
|
+
}
|
|
145
|
+
const path = join(directory, 'cordis.patch.yml');
|
|
146
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
147
|
+
try {
|
|
148
|
+
if (reread && await reread() !== effective)
|
|
149
|
+
fail('effective configuration changed before setup; no patch committed');
|
|
150
|
+
const before = await readFile(path, 'utf8');
|
|
151
|
+
const plan = prepareRepairAdmission(input, before, effective, task);
|
|
152
|
+
if (plan.patch !== before) {
|
|
153
|
+
await writeFile(temporary, plan.patch, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
154
|
+
if (await readFile(path, 'utf8') !== before || reread && await reread() !== effective || !isDeepStrictEqual(owner(plan.databasePath, input.profile), plan.owner))
|
|
155
|
+
fail('configuration, owner, or budget changed during setup; no patch committed');
|
|
156
|
+
await rename(temporary, path);
|
|
157
|
+
}
|
|
158
|
+
return { path, id: plan.id };
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await rm(temporary, { force: true });
|
|
162
|
+
await rm(lock, { recursive: true, force: true });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=repair-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair-setup.js","sourceRoot":"","sources":["../src/repair-setup.ts"],"names":[],"mappings":"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"}
|
package/lib/setup.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type AutonomySetupOptions } from './autonomy.js';
|
|
2
|
+
export interface WebOwnerSetupInput {
|
|
3
|
+
dshHome: string;
|
|
4
|
+
profile: string;
|
|
5
|
+
workspace: string;
|
|
6
|
+
preset: string;
|
|
7
|
+
isolation?: AutonomySetupOptions;
|
|
8
|
+
}
|
|
9
|
+
export declare function literalPath(node: unknown, input: WebOwnerSetupInput, label: string): string;
|
|
10
|
+
/** Materialize complete Cordis config replacements while retaining YAML tags and custom siblings. */
|
|
11
|
+
export declare function prepareWebOwnerProfile(input: WebOwnerSetupInput, source: string, effectiveSource: string): {
|
|
12
|
+
patch: string;
|
|
13
|
+
databasePath: string;
|
|
14
|
+
principal: {
|
|
15
|
+
channel: 'web';
|
|
16
|
+
account: string;
|
|
17
|
+
tenant: string;
|
|
18
|
+
user: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/** Local offline setup. A failed YAML commit may leave a newly paired identity; retry preserves its lineage. */
|
|
22
|
+
export declare function configureWebOwner(input: WebOwnerSetupInput, effectiveSource: string): Promise<string>;
|
|
23
|
+
export declare function runWebOwnerSetup(argv?: string[]): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAI9H,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,oBAAoB,CAAA;CACjC;AA4CD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW3F;AAED,qGAAqG;AACrG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG;IAC1G,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAClH,CA2DA;AAYD,gHAAgH;AAChH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B3G;AAED,wBAAsB,gBAAgB,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DlF"}
|
package/lib/setup.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { lstat, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { isAbsolute, join, normalize } from 'node:path';
|
|
6
|
+
import { isDeepStrictEqual, promisify } from 'node:util';
|
|
7
|
+
import { autonomyDockerPath, prepareAutonomyProfile, validateAutonomyOptions } from './autonomy.js';
|
|
8
|
+
import { ensurePrincipalLocally } from '@dsh-enhanced/assistant-delivery';
|
|
9
|
+
import { isMap, isScalar, isSeq, parseDocument } from 'yaml';
|
|
10
|
+
const key = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
11
|
+
const slugs = ['personal-assistant', 'assistant-delivery', 'assistant-goals', 'assistant-web-owner'];
|
|
12
|
+
function fail(message) { throw new Error(`assistant-web-owner setup: ${message}`); }
|
|
13
|
+
function validate(input) {
|
|
14
|
+
if (input.isolation)
|
|
15
|
+
validateAutonomyOptions(input.isolation);
|
|
16
|
+
if (!key.test(input.profile) || !/^[a-z0-9][a-z0-9-]*$/u.test(input.preset))
|
|
17
|
+
fail('invalid profile or preset');
|
|
18
|
+
for (const value of [input.dshHome, input.workspace]) {
|
|
19
|
+
if (!isAbsolute(value) || value.includes('\0') || value.includes('*'))
|
|
20
|
+
fail('home and workspace must be literal absolute paths');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function parse(source, label) {
|
|
24
|
+
const document = parseDocument(source.trim() === '' ? '[]' : source, {
|
|
25
|
+
customTags: [{ tag: 'tag:yaml.org,2002:js', resolve: (value) => value }],
|
|
26
|
+
});
|
|
27
|
+
if (document.errors.length > 0 || !isSeq(document.contents))
|
|
28
|
+
fail(`${label} must be an unambiguous YAML sequence`);
|
|
29
|
+
return { document, rows: document.contents };
|
|
30
|
+
}
|
|
31
|
+
function row(rows, slug, required) {
|
|
32
|
+
const id = `dsh-enhanced-${slug}`;
|
|
33
|
+
const name = `@dsh-enhanced/${slug}`;
|
|
34
|
+
const matches = rows.items.filter(item => isMap(item) && (item.get('id') === id || item.get('name') === name));
|
|
35
|
+
if (matches.length > 1)
|
|
36
|
+
fail(`duplicate or shadowed ${id}`);
|
|
37
|
+
const match = matches[0];
|
|
38
|
+
if (match === undefined) {
|
|
39
|
+
if (required)
|
|
40
|
+
fail(`install ${name} before setup`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
if (match.get('id') !== id || (match.has('name') && match.get('name') !== name)
|
|
44
|
+
|| (match.has('disabled') && match.get('disabled') !== false))
|
|
45
|
+
fail(`invalid or disabled ${id}`);
|
|
46
|
+
return match;
|
|
47
|
+
}
|
|
48
|
+
function map(value, label) {
|
|
49
|
+
if (!isMap(value))
|
|
50
|
+
fail(`${label} must be a mapping`);
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
function merge(base, overlay) {
|
|
54
|
+
const result = map(base.clone(), 'cloned config');
|
|
55
|
+
for (const pair of overlay.items) {
|
|
56
|
+
if (!isScalar(pair.key) || typeof pair.key.value !== 'string')
|
|
57
|
+
fail('config keys must be strings');
|
|
58
|
+
const inherited = result.get(pair.key.value, true);
|
|
59
|
+
const value = pair.value;
|
|
60
|
+
result.set(pair.key.value, isMap(inherited) && isMap(value) ? merge(inherited, value) : value?.clone() ?? null);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
export function literalPath(node, input, label) {
|
|
65
|
+
if (!isScalar(node) || typeof node.value !== 'string')
|
|
66
|
+
fail(`${label} must be an absolute path`);
|
|
67
|
+
let value = node.value;
|
|
68
|
+
if (node.tag === 'tag:yaml.org,2002:js') {
|
|
69
|
+
// Recognize only the published path helper. Never evaluate arbitrary YAML JS.
|
|
70
|
+
const match = /^dshHomePath\(['"]([^'"\n]+)['"]\)$/u.exec(value);
|
|
71
|
+
if (match === null || isAbsolute(match[1]) || match[1].split('/').includes('..'))
|
|
72
|
+
fail(`${label} needs a literal path or dshHomePath`);
|
|
73
|
+
value = join(input.dshHome, match[1]);
|
|
74
|
+
}
|
|
75
|
+
else if (node.tag !== undefined && node.tag !== 'tag:yaml.org,2002:str')
|
|
76
|
+
fail(`${label} has an unsupported tag`);
|
|
77
|
+
if (!isAbsolute(value) || value.includes('\0') || value.includes('*'))
|
|
78
|
+
fail(`${label} must be a literal absolute path`);
|
|
79
|
+
return normalize(value);
|
|
80
|
+
}
|
|
81
|
+
/** Materialize complete Cordis config replacements while retaining YAML tags and custom siblings. */
|
|
82
|
+
export function prepareWebOwnerProfile(input, source, effectiveSource) {
|
|
83
|
+
validate(input);
|
|
84
|
+
const target = parse(source, 'profile patch');
|
|
85
|
+
const effective = parse(effectiveSource, 'effective profile');
|
|
86
|
+
const configs = new Map();
|
|
87
|
+
for (const slug of slugs) {
|
|
88
|
+
const inherited = row(effective.rows, slug, true);
|
|
89
|
+
const existing = row(target.rows, slug, false);
|
|
90
|
+
const base = inherited.has('config') ? map(inherited.get('config', true), slug) : target.document.createNode({});
|
|
91
|
+
const config = existing?.has('config') ? merge(base, map(existing.get('config', true), slug)) : map(base.clone(), slug);
|
|
92
|
+
const destination = existing ?? target.document.createNode({ id: `dsh-enhanced-${slug}`, name: `@dsh-enhanced/${slug}` });
|
|
93
|
+
destination.set('config', config);
|
|
94
|
+
if (existing === undefined)
|
|
95
|
+
target.rows.add(destination);
|
|
96
|
+
configs.set(slug, config);
|
|
97
|
+
}
|
|
98
|
+
const principal = { channel: 'web', account: input.profile, tenant: 'local', user: 'operator' };
|
|
99
|
+
const owner = configs.get('assistant-web-owner');
|
|
100
|
+
const identity = { account: principal.account, tenant: principal.tenant, user: principal.user };
|
|
101
|
+
if (owner.has('principal')) {
|
|
102
|
+
const old = map(owner.get('principal', true), 'existing Web identity');
|
|
103
|
+
for (const [field, value] of Object.entries(identity))
|
|
104
|
+
if (old.get(field) !== value)
|
|
105
|
+
fail('existing Web owner identity differs; explicit owner migration is required');
|
|
106
|
+
}
|
|
107
|
+
for (const [field, value] of Object.entries({ workspace: input.workspace, preset: input.preset })) {
|
|
108
|
+
if (owner.has(field) && owner.get(field) !== value)
|
|
109
|
+
fail(`existing Web ${field} differs; preserve the existing scope or migrate explicitly`);
|
|
110
|
+
owner.set(field, value);
|
|
111
|
+
}
|
|
112
|
+
owner.set('principal', target.document.createNode(identity));
|
|
113
|
+
if (!owner.has('maxExecutionMs'))
|
|
114
|
+
owner.set('maxExecutionMs', 300_000);
|
|
115
|
+
const delivery = configs.get('assistant-delivery');
|
|
116
|
+
const databasePath = literalPath(delivery.get('databasePath', true), input, 'Delivery databasePath');
|
|
117
|
+
literalPath(delivery.get('spoolPath', true), input, 'Delivery spoolPath');
|
|
118
|
+
// YAMLMap.set(string) mutates an existing scalar and retains its !!js tag.
|
|
119
|
+
// A selected literal must replace that node, or Loader evaluates /path as JS.
|
|
120
|
+
delivery.set('defaultWorkspace', target.document.createNode(input.workspace));
|
|
121
|
+
delivery.set('defaultAgentPreset', target.document.createNode(input.preset));
|
|
122
|
+
const goals = configs.get('assistant-goals');
|
|
123
|
+
if (!goals.has('databasePath'))
|
|
124
|
+
goals.set('databasePath', join(input.dshHome, 'assistant-goals', `${input.profile}.sqlite`));
|
|
125
|
+
else
|
|
126
|
+
literalPath(goals.get('databasePath', true), input, 'Goals databasePath');
|
|
127
|
+
const personal = configs.get('personal-assistant');
|
|
128
|
+
for (const sibling of ['personalMemory', 'personalWiki', 'assistantAutomations'])
|
|
129
|
+
map(personal.get(sibling, true), sibling);
|
|
130
|
+
const policy = map(personal.get('assistantPolicy', true), 'assistantPolicy');
|
|
131
|
+
literalPath(policy.get('databasePath', true), input, 'Policy databasePath');
|
|
132
|
+
let rules = policy.get('rules', true);
|
|
133
|
+
if (rules === undefined || (isScalar(rules) && rules.value === null)) {
|
|
134
|
+
rules = target.document.createNode([]);
|
|
135
|
+
policy.set('rules', rules);
|
|
136
|
+
}
|
|
137
|
+
if (!isSeq(rules))
|
|
138
|
+
fail('Policy rules must be a sequence');
|
|
139
|
+
const principalId = `web/${input.profile}/local/operator`;
|
|
140
|
+
const managed = [
|
|
141
|
+
{ id: `dsh-enhanced-web-${input.profile}-ingest`, effect: 'allow', subject: { kind: 'external', id: principalId }, actions: ['ingest'], resource: { kind: 'message', id: '*' }, context: { initiators: ['external'] } },
|
|
142
|
+
{ id: `dsh-enhanced-web-${input.profile}-capability`, effect: 'allow', subject: { kind: 'agent', id: input.preset, workspace: input.workspace, principal: principalId }, actions: ['*'], resource: { kind: '*', id: '*' }, context: { initiators: ['external'] } },
|
|
143
|
+
];
|
|
144
|
+
for (const rule of managed) {
|
|
145
|
+
const matches = rules.items.filter(item => isMap(item) && item.get('id') === rule.id);
|
|
146
|
+
if (matches.length > 1)
|
|
147
|
+
fail(`duplicate managed rule ${rule.id}`);
|
|
148
|
+
if (matches[0] !== undefined) {
|
|
149
|
+
// Customizations are not silently overwritten, including edited allow/deny rules.
|
|
150
|
+
if (!isDeepStrictEqual(matches[0].toJSON(), rule))
|
|
151
|
+
fail(`managed rule ${rule.id} was customized; review it before setup`);
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
rules.add(target.document.createNode(rule));
|
|
155
|
+
}
|
|
156
|
+
return { patch: target.document.toString({ lineWidth: 0 }), databasePath, principal };
|
|
157
|
+
}
|
|
158
|
+
async function readPatch(path) {
|
|
159
|
+
try {
|
|
160
|
+
if (!(await lstat(path)).isFile())
|
|
161
|
+
fail('profile patch must be a regular file, not a symlink');
|
|
162
|
+
return await readFile(path, 'utf8');
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (error.code === 'ENOENT')
|
|
166
|
+
return '';
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Local offline setup. A failed YAML commit may leave a newly paired identity; retry preserves its lineage. */
|
|
171
|
+
export async function configureWebOwner(input, effectiveSource) {
|
|
172
|
+
validate(input);
|
|
173
|
+
const directory = join(input.dshHome, 'profiles', input.profile);
|
|
174
|
+
if (!(await lstat(directory)).isDirectory())
|
|
175
|
+
fail('install the target profile first');
|
|
176
|
+
const lock = join(directory, '.assistant-web-owner-setup.lock');
|
|
177
|
+
try {
|
|
178
|
+
await mkdir(lock, { mode: 0o700 });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error.code === 'EEXIST')
|
|
182
|
+
fail('another setup holds the profile lock; inspect the previous setup before retrying');
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
const path = join(directory, 'cordis.patch.yml');
|
|
186
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
187
|
+
try {
|
|
188
|
+
const before = await readPatch(path);
|
|
189
|
+
const plan = prepareWebOwnerProfile(input, before, effectiveSource);
|
|
190
|
+
await mkdir(input.workspace, { recursive: true });
|
|
191
|
+
if (input.isolation) {
|
|
192
|
+
const preflight = prepareAutonomyProfile({ ...input, isolation: input.isolation }, plan.patch, effectiveSource);
|
|
193
|
+
const { probeIsolationRuntime } = await import('@dsh-enhanced/assistant-isolation');
|
|
194
|
+
await probeIsolationRuntime(input.isolation.image, autonomyDockerPath(preflight));
|
|
195
|
+
}
|
|
196
|
+
const owner = ensurePrincipalLocally({ databasePath: plan.databasePath, principal: plan.principal });
|
|
197
|
+
if (input.isolation)
|
|
198
|
+
plan.patch = prepareAutonomyProfile({ ...input, isolation: input.isolation }, plan.patch, effectiveSource, owner);
|
|
199
|
+
if (plan.patch === before)
|
|
200
|
+
return path;
|
|
201
|
+
await writeFile(temporary, plan.patch, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
202
|
+
if (await readPatch(path) !== before)
|
|
203
|
+
fail('profile changed during setup; retry with its latest configuration');
|
|
204
|
+
await rename(temporary, path);
|
|
205
|
+
return path;
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
await rm(temporary, { force: true });
|
|
209
|
+
await rm(lock, { recursive: true, force: true });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export async function runWebOwnerSetup(argv = process.argv.slice(2)) {
|
|
213
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
214
|
+
process.stdout.write('Usage: dsh-web-owner-setup --profile <name> --workspace <absolute-path> [--preset standard] [--dsh-home <absolute-path>] [--isolation-image sha256:<id> --isolation-max-runs 20 --isolation-lease-ms 3600000 --isolation-runtime-ms 600000]\nGoal setup: use --list-goal-sessions to show real idle owner Sessions, or --goal-admission <private-absolute-task.json> [--session-id <existing-idle-session>]. Without --session-id, setup selects the sole matching idle Session and otherwise prints candidates.\nRepair setup: --repair-admission <private-absolute-json> installs preconfigured finite repair profiles after checking the current owner scope, owner route, Goals execution budget, exact model routes, Skills holdouts and Verifier profiles. It creates no Goal, Session, credential, grant, or unlimited authority.\nInitializes one local Web owner without replacing existing owner authority. Stop the target Host before setup; configuration changes require restart.\n');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const input = { dshHome: process.env.DSH_HOME ?? join(homedir(), '.dsh'), profile: 'web', workspace: '', preset: 'standard' };
|
|
218
|
+
const isolation = { image: '', maxRuns: 20, leaseMs: 3_600_000, maxTotalDurationMs: 600_000 };
|
|
219
|
+
let isolated = false;
|
|
220
|
+
let goalAdmission;
|
|
221
|
+
let repairAdmission;
|
|
222
|
+
let sessionId;
|
|
223
|
+
let listGoalSessions = false;
|
|
224
|
+
const numeric = { '--isolation-max-runs': 'maxRuns', '--isolation-lease-ms': 'leaseMs', '--isolation-runtime-ms': 'maxTotalDurationMs' };
|
|
225
|
+
const fields = { '--dsh-home': 'dshHome', '--profile': 'profile', '--workspace': 'workspace', '--preset': 'preset' };
|
|
226
|
+
for (let index = 0; index < argv.length; index++) {
|
|
227
|
+
const option = argv[index];
|
|
228
|
+
if (option === '--list-goal-sessions') {
|
|
229
|
+
listGoalSessions = true;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (!(option in fields) && !['--isolation-image', '--goal-admission', '--repair-admission', '--session-id'].includes(option) && !(option in numeric))
|
|
233
|
+
fail(`unknown option ${option}`);
|
|
234
|
+
const value = argv[++index];
|
|
235
|
+
if (value === undefined || value.startsWith('--'))
|
|
236
|
+
fail(`${option} requires a value`);
|
|
237
|
+
if (option === '--goal-admission')
|
|
238
|
+
goalAdmission = value;
|
|
239
|
+
else if (option === '--repair-admission')
|
|
240
|
+
repairAdmission = value;
|
|
241
|
+
else if (option === '--session-id')
|
|
242
|
+
sessionId = value;
|
|
243
|
+
else if (option === '--isolation-image') {
|
|
244
|
+
isolation.image = value;
|
|
245
|
+
isolated = true;
|
|
246
|
+
}
|
|
247
|
+
else if (option in numeric) {
|
|
248
|
+
if (!/^[1-9][0-9]*$/.test(value))
|
|
249
|
+
fail(`${option} requires a positive integer`);
|
|
250
|
+
isolation[numeric[option]] = Number(value);
|
|
251
|
+
isolated = true;
|
|
252
|
+
}
|
|
253
|
+
else
|
|
254
|
+
input[fields[option]] = value;
|
|
255
|
+
}
|
|
256
|
+
if (isolated)
|
|
257
|
+
input.isolation = isolation;
|
|
258
|
+
validate(input);
|
|
259
|
+
if (listGoalSessions && (goalAdmission !== undefined || repairAdmission !== undefined || sessionId !== undefined || isolated))
|
|
260
|
+
fail('--list-goal-sessions cannot be combined with setup, goal admission, repair admission, or isolation options');
|
|
261
|
+
if (sessionId !== undefined && goalAdmission === undefined)
|
|
262
|
+
fail('--session-id requires --goal-admission');
|
|
263
|
+
if (repairAdmission !== undefined && (goalAdmission !== undefined || sessionId !== undefined || isolated))
|
|
264
|
+
fail('--repair-admission cannot be combined with goal admission, session selection, or isolation options');
|
|
265
|
+
const readEffectiveSource = async () => {
|
|
266
|
+
try {
|
|
267
|
+
const result = await promisify(execFile)('dsh', ['--profile', input.profile, '--dump-config'], {
|
|
268
|
+
env: { ...process.env, DSH_HOME: input.dshHome }, timeout: 30_000, maxBuffer: 8 * 1024 * 1024,
|
|
269
|
+
});
|
|
270
|
+
return result.stdout;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
fail('could not read the effective DSH profile; check installed bundles and dsh --dump-config');
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
const effective = await readEffectiveSource();
|
|
277
|
+
if (listGoalSessions) {
|
|
278
|
+
const { listGoalAdmissionSessions } = await import('./goal-setup.js');
|
|
279
|
+
const sessions = await listGoalAdmissionSessions(input, effective);
|
|
280
|
+
process.stdout.write(sessions.length === 0 ? 'No matching idle Web owner Sessions. Open the native Web UI once; this command never creates a Session.\n' : `Idle Web owner Sessions:\n${sessions.map(id => ` ${id}\n`).join('')}`);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (goalAdmission !== undefined) {
|
|
284
|
+
const { configureGoalAdmission } = await import('./goal-setup.js');
|
|
285
|
+
const result = await configureGoalAdmission(input, effective, goalAdmission, sessionId, readEffectiveSource);
|
|
286
|
+
if (result.repositoryDelivery)
|
|
287
|
+
process.stdout.write(`Repository: ${result.repositoryDelivery.repository}; branch: ${result.repositoryDelivery.branch}. Authorized paths: ${result.repositoryDelivery.paths.join(', ')}. Independent acceptance: ${result.repositoryDelivery.acceptance}. Credential availability and remote GitHub access have not been tested.\n`);
|
|
288
|
+
process.stdout.write(`Goal configuration written: ${result.path}\nAdmission: ${result.admissionId}; Session: ${result.sessionId}. Existing authority and budget are preserved. Restart the target Host. v2 uses the already configured exact provider/model route; v1 retains deepseek-goal-metered. Model connectivity and runtime admission have not been tested.\n`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (repairAdmission !== undefined) {
|
|
292
|
+
const { configureRepairAdmission } = await import('./repair-setup.js');
|
|
293
|
+
const result = await configureRepairAdmission(input, effective, repairAdmission, readEffectiveSource);
|
|
294
|
+
process.stdout.write(`Repair configuration written: ${result.path}\nProfile: ${result.id}. Existing authority and budgets were not expanded. Restart the target Host. Configuration completion is not real repair acceptance, canary success, or autonomous-improvement evidence.\n`);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const path = await configureWebOwner(input, effective);
|
|
298
|
+
if (input.isolation)
|
|
299
|
+
process.stdout.write(`Isolated execution probe passed. Finite grant: autonomy-${input.profile}. Existing grant expiry and used budget are preserved. GitHub action credentials and autonomous goal verification are not configured by this step.\n`);
|
|
300
|
+
process.stdout.write(`Web owner configured for ${input.profile}: ${path}\nWorkspace: ${input.workspace}; preset: ${input.preset}. Model connectivity and runtime readiness require the installer checks.\n`);
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=setup.js.map
|
package/lib/setup.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|