advisor-pi 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/config-ui.d.ts +12 -0
- package/dist/config-ui.d.ts.map +1 -0
- package/dist/config-ui.js +26 -0
- package/dist/config-ui.js.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +188 -38
- package/dist/index.js.map +1 -1
- package/dist/preferences.d.ts +40 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +198 -0
- package/dist/preferences.js.map +1 -0
- package/package.json +1 -1
- package/src/config-ui.ts +40 -0
- package/src/index.ts +206 -36
- package/src/preferences.ts +228 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare const PREFERENCES_VERSION = 1;
|
|
2
|
+
/** Fixed allow-listed names within the extension-specific preferences directory. */
|
|
3
|
+
export declare const PREFERENCE_FILE_NAMES: Readonly<{
|
|
4
|
+
enabled: "enabled.json";
|
|
5
|
+
model: "model.json";
|
|
6
|
+
thinkingLevel: "thinkingLevel.json";
|
|
7
|
+
maxUses: "maxUses.json";
|
|
8
|
+
cacheRetention: "cacheRetention.json";
|
|
9
|
+
maxTranscriptChars: "maxTranscriptChars.json";
|
|
10
|
+
}>;
|
|
11
|
+
export type AdvisorPreferencesPatch = {
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
provider?: string;
|
|
14
|
+
modelId?: string;
|
|
15
|
+
thinkingLevel?: "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
16
|
+
maxUses?: number;
|
|
17
|
+
cacheRetention?: "none" | "short" | "long";
|
|
18
|
+
maxTranscriptChars?: number;
|
|
19
|
+
};
|
|
20
|
+
export type AdvisorPreferences = AdvisorPreferencesPatch & {
|
|
21
|
+
version: typeof PREFERENCES_VERSION;
|
|
22
|
+
};
|
|
23
|
+
/** Return the directory containing advisor-pi's per-setting files. */
|
|
24
|
+
export declare function preferencesPath(agentDir?: string): string;
|
|
25
|
+
/** Read and independently validate the durable advisor settings. */
|
|
26
|
+
export declare function loadPreferences(agentDir?: string): AdvisorPreferencesPatch;
|
|
27
|
+
/** Validate and persist supplied logical settings without any aggregate snapshot. */
|
|
28
|
+
export declare function savePreferences(config: AdvisorPreferencesPatch, agentDir?: string): Promise<boolean>;
|
|
29
|
+
/** Validate and persist one or more deliberate logical setting edits. */
|
|
30
|
+
export declare function savePreferencesPatch(patch: AdvisorPreferencesPatch, agentDir?: string): Promise<boolean>;
|
|
31
|
+
export type AdvisorPreferencesConfig = {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
provider: string;
|
|
34
|
+
modelId: string;
|
|
35
|
+
thinkingLevel: NonNullable<AdvisorPreferencesPatch["thinkingLevel"]>;
|
|
36
|
+
maxUses: number;
|
|
37
|
+
cacheRetention: NonNullable<AdvisorPreferencesPatch["cacheRetention"]>;
|
|
38
|
+
maxTranscriptChars: number;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../src/preferences.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,oFAAoF;AACpF,eAAO,MAAM,qBAAqB;;;;;;;EAOhC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG;IAAE,OAAO,EAAE,OAAO,mBAAmB,CAAA;CAAE,CAAC;AAEnG,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAExE;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,uBAAuB,CAwBzF;AAED,qFAAqF;AACrF,wBAAsB,eAAe,CAAC,MAAM,EAAE,uBAAuB,EAAE,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzH;AAED,yEAAyE;AACzE,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7H;AAyHD,MAAM,MAAM,wBAAwB,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,WAAW,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,WAAW,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvE,kBAAkB,EAAE,MAAM,CAAC;CAC3B,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
export const PREFERENCES_VERSION = 1;
|
|
6
|
+
/** Fixed allow-listed names within the extension-specific preferences directory. */
|
|
7
|
+
export const PREFERENCE_FILE_NAMES = Object.freeze({
|
|
8
|
+
enabled: "enabled.json",
|
|
9
|
+
model: "model.json",
|
|
10
|
+
thinkingLevel: "thinkingLevel.json",
|
|
11
|
+
maxUses: "maxUses.json",
|
|
12
|
+
cacheRetention: "cacheRetention.json",
|
|
13
|
+
maxTranscriptChars: "maxTranscriptChars.json",
|
|
14
|
+
});
|
|
15
|
+
/** Return the directory containing advisor-pi's per-setting files. */
|
|
16
|
+
export function preferencesPath(agentDir = getAgentDir()) {
|
|
17
|
+
return join(agentDir, "advisor-pi-preferences");
|
|
18
|
+
}
|
|
19
|
+
/** Read and independently validate the durable advisor settings. */
|
|
20
|
+
export function loadPreferences(agentDir = getAgentDir()) {
|
|
21
|
+
const patch = {};
|
|
22
|
+
const enabled = readPreference(agentDir, PREFERENCE_FILE_NAMES.enabled);
|
|
23
|
+
if (enabled && typeof enabled.enabled === "boolean")
|
|
24
|
+
patch.enabled = enabled.enabled;
|
|
25
|
+
const model = readPreference(agentDir, PREFERENCE_FILE_NAMES.model);
|
|
26
|
+
if (model && typeof model.provider === "string" && model.provider.trim() && typeof model.modelId === "string" && model.modelId.trim()) {
|
|
27
|
+
patch.provider = model.provider.trim();
|
|
28
|
+
patch.modelId = model.modelId.trim();
|
|
29
|
+
}
|
|
30
|
+
const thinkingLevel = parseThinkingLevel(readPreference(agentDir, PREFERENCE_FILE_NAMES.thinkingLevel)?.thinkingLevel);
|
|
31
|
+
if (thinkingLevel)
|
|
32
|
+
patch.thinkingLevel = thinkingLevel;
|
|
33
|
+
const maxUses = readPreference(agentDir, PREFERENCE_FILE_NAMES.maxUses)?.maxUses;
|
|
34
|
+
if (isPositiveSafeInteger(maxUses))
|
|
35
|
+
patch.maxUses = maxUses;
|
|
36
|
+
const cacheRetention = parseCacheRetention(readPreference(agentDir, PREFERENCE_FILE_NAMES.cacheRetention)?.cacheRetention);
|
|
37
|
+
if (cacheRetention)
|
|
38
|
+
patch.cacheRetention = cacheRetention;
|
|
39
|
+
const maxTranscriptChars = readPreference(agentDir, PREFERENCE_FILE_NAMES.maxTranscriptChars)?.maxTranscriptChars;
|
|
40
|
+
if (isPositiveSafeInteger(maxTranscriptChars))
|
|
41
|
+
patch.maxTranscriptChars = maxTranscriptChars;
|
|
42
|
+
return patch;
|
|
43
|
+
}
|
|
44
|
+
/** Validate and persist supplied logical settings without any aggregate snapshot. */
|
|
45
|
+
export async function savePreferences(config, agentDir = getAgentDir()) {
|
|
46
|
+
return saveValidatedPreferences(config, agentDir);
|
|
47
|
+
}
|
|
48
|
+
/** Validate and persist one or more deliberate logical setting edits. */
|
|
49
|
+
export async function savePreferencesPatch(patch, agentDir = getAgentDir()) {
|
|
50
|
+
return saveValidatedPreferences(patch, agentDir);
|
|
51
|
+
}
|
|
52
|
+
async function saveValidatedPreferences(input, agentDir) {
|
|
53
|
+
const writes = prepareWrites(input);
|
|
54
|
+
if (!writes)
|
|
55
|
+
return false;
|
|
56
|
+
try {
|
|
57
|
+
mkdirSync(preferencesPath(agentDir), { recursive: true, mode: 0o700 });
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
for (const write of writes) {
|
|
63
|
+
if (!writePreference(agentDir, write))
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
function prepareWrites(input) {
|
|
69
|
+
if (!isRecord(input))
|
|
70
|
+
return undefined;
|
|
71
|
+
if (input.version !== undefined && input.version !== PREFERENCES_VERSION)
|
|
72
|
+
return undefined;
|
|
73
|
+
const keys = Object.keys(input).filter((key) => key !== "version");
|
|
74
|
+
if (keys.length === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
const writes = [];
|
|
77
|
+
const hasProvider = keys.includes("provider");
|
|
78
|
+
const hasModelId = keys.includes("modelId");
|
|
79
|
+
if (hasProvider || hasModelId) {
|
|
80
|
+
if (!hasProvider || !hasModelId || typeof input.provider !== "string" || !input.provider.trim() || typeof input.modelId !== "string" || !input.modelId.trim()) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
writes.push({
|
|
84
|
+
fileName: PREFERENCE_FILE_NAMES.model,
|
|
85
|
+
payload: {
|
|
86
|
+
version: PREFERENCES_VERSION,
|
|
87
|
+
provider: input.provider.trim(),
|
|
88
|
+
modelId: input.modelId.trim(),
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
for (const key of keys) {
|
|
93
|
+
switch (key) {
|
|
94
|
+
case "provider":
|
|
95
|
+
case "modelId":
|
|
96
|
+
break;
|
|
97
|
+
case "enabled":
|
|
98
|
+
if (typeof input.enabled !== "boolean")
|
|
99
|
+
return undefined;
|
|
100
|
+
writes.push({ fileName: PREFERENCE_FILE_NAMES.enabled, payload: { version: PREFERENCES_VERSION, enabled: input.enabled } });
|
|
101
|
+
break;
|
|
102
|
+
case "thinkingLevel": {
|
|
103
|
+
const thinkingLevel = parseThinkingLevel(input.thinkingLevel);
|
|
104
|
+
if (!thinkingLevel)
|
|
105
|
+
return undefined;
|
|
106
|
+
writes.push({ fileName: PREFERENCE_FILE_NAMES.thinkingLevel, payload: { version: PREFERENCES_VERSION, thinkingLevel } });
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case "maxUses":
|
|
110
|
+
if (!isPositiveSafeInteger(input.maxUses))
|
|
111
|
+
return undefined;
|
|
112
|
+
writes.push({ fileName: PREFERENCE_FILE_NAMES.maxUses, payload: { version: PREFERENCES_VERSION, maxUses: input.maxUses } });
|
|
113
|
+
break;
|
|
114
|
+
case "cacheRetention": {
|
|
115
|
+
const cacheRetention = parseCacheRetention(input.cacheRetention);
|
|
116
|
+
if (!cacheRetention)
|
|
117
|
+
return undefined;
|
|
118
|
+
writes.push({ fileName: PREFERENCE_FILE_NAMES.cacheRetention, payload: { version: PREFERENCES_VERSION, cacheRetention } });
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case "maxTranscriptChars":
|
|
122
|
+
if (!isPositiveSafeInteger(input.maxTranscriptChars))
|
|
123
|
+
return undefined;
|
|
124
|
+
writes.push({
|
|
125
|
+
fileName: PREFERENCE_FILE_NAMES.maxTranscriptChars,
|
|
126
|
+
payload: { version: PREFERENCES_VERSION, maxTranscriptChars: input.maxTranscriptChars },
|
|
127
|
+
});
|
|
128
|
+
break;
|
|
129
|
+
default:
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return writes;
|
|
134
|
+
}
|
|
135
|
+
function readPreference(agentDir, fileName) {
|
|
136
|
+
try {
|
|
137
|
+
const parsed = JSON.parse(readFileSync(join(preferencesPath(agentDir), fileName), "utf8"));
|
|
138
|
+
if (!isRecord(parsed))
|
|
139
|
+
return undefined;
|
|
140
|
+
if (parsed.version !== undefined && parsed.version !== PREFERENCES_VERSION)
|
|
141
|
+
return undefined;
|
|
142
|
+
return parsed;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function writePreference(agentDir, write) {
|
|
149
|
+
const directory = preferencesPath(agentDir);
|
|
150
|
+
const temporaryPath = join(directory, `.${write.fileName}.${process.pid}.${randomUUID()}.tmp`);
|
|
151
|
+
let fileDescriptor;
|
|
152
|
+
try {
|
|
153
|
+
fileDescriptor = openSync(temporaryPath, "wx", 0o600);
|
|
154
|
+
writeFileSync(fileDescriptor, `${JSON.stringify(write.payload, null, 2)}\n`, "utf8");
|
|
155
|
+
fsyncSync(fileDescriptor);
|
|
156
|
+
closeSync(fileDescriptor);
|
|
157
|
+
fileDescriptor = undefined;
|
|
158
|
+
renameSync(temporaryPath, join(directory, write.fileName));
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
if (fileDescriptor !== undefined) {
|
|
166
|
+
try {
|
|
167
|
+
closeSync(fileDescriptor);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Best-effort cleanup after a failed write.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
unlinkSync(temporaryPath);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// The rename succeeded, or the temporary file was never created.
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function isRecord(value) {
|
|
182
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
183
|
+
}
|
|
184
|
+
function isPositiveSafeInteger(value) {
|
|
185
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
186
|
+
}
|
|
187
|
+
function parseCacheRetention(value) {
|
|
188
|
+
if (value === "none" || value === "short" || value === "long")
|
|
189
|
+
return value;
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
function parseThinkingLevel(value) {
|
|
193
|
+
if (value === "minimal" || value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max") {
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../src/preferences.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/config-ui.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AdvisorConfig } from "./index.js";
|
|
2
|
+
|
|
3
|
+
/** Rows used by the interactive advisor-pi settings menu. */
|
|
4
|
+
export type MenuRow<TKey extends string = string> = { key: TKey; label: string };
|
|
5
|
+
|
|
6
|
+
export type MenuKey =
|
|
7
|
+
| "enabled"
|
|
8
|
+
| "model"
|
|
9
|
+
| "thinking"
|
|
10
|
+
| "max-uses"
|
|
11
|
+
| "max-transcript-chars"
|
|
12
|
+
| "cache"
|
|
13
|
+
| "reset"
|
|
14
|
+
| "close";
|
|
15
|
+
|
|
16
|
+
/** Build the top-level settings rows, including the current value for each setting. */
|
|
17
|
+
export function buildMenuRows(config: AdvisorConfig, useCount = 0): MenuRow<MenuKey>[] {
|
|
18
|
+
const entries: Array<[MenuKey, string, string]> = [
|
|
19
|
+
["enabled", "Advisor enabled", config.enabled ? "enabled" : "disabled"],
|
|
20
|
+
["model", "Advisor model", "configured (use /advisor-pi status for ID)"],
|
|
21
|
+
["thinking", "Advisor thinking", config.thinkingLevel],
|
|
22
|
+
["max-uses", "Max advisor uses", String(config.maxUses)],
|
|
23
|
+
["max-transcript-chars", "Max transcript chars", String(config.maxTranscriptChars)],
|
|
24
|
+
["cache", "Cache retention", config.cacheRetention],
|
|
25
|
+
];
|
|
26
|
+
const width = Math.max(...entries.map(([, label]) => label.length));
|
|
27
|
+
const rows = entries.map(([key, label, value]) => ({
|
|
28
|
+
key,
|
|
29
|
+
label: `${label.padEnd(width)} ${value}`,
|
|
30
|
+
}));
|
|
31
|
+
rows.push({ key: "reset", label: `Reset use count (${useCount} used)` });
|
|
32
|
+
rows.push({ key: "close", label: "Close" });
|
|
33
|
+
return rows;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Maps a selected label back to its row; cancelled dialogs return undefined. */
|
|
37
|
+
export function rowForLabel<TKey extends string>(rows: MenuRow<TKey>[], label: string | undefined): MenuRow<TKey> | undefined {
|
|
38
|
+
if (label === undefined) return undefined;
|
|
39
|
+
return rows.find((row) => row.label === label);
|
|
40
|
+
}
|