@provos/ironcurtain 0.7.0 → 0.7.1
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 +24 -100
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/constitution-readonly.md +21 -0
- package/dist/config/generated-readonly/compiled-policy.json +468 -0
- package/dist/config/paths.d.ts +17 -0
- package/dist/config/paths.js +23 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/cron/constitution-generator.d.ts +60 -0
- package/dist/cron/constitution-generator.js +217 -0
- package/dist/cron/constitution-generator.js.map +1 -0
- package/dist/cron/job-commands.js +104 -41
- package/dist/cron/job-commands.js.map +1 -1
- package/dist/cron/job-customizer.d.ts +22 -0
- package/dist/cron/job-customizer.js +47 -0
- package/dist/cron/job-customizer.js.map +1 -0
- package/dist/cron/types.d.ts +8 -0
- package/dist/cron/types.js +3 -6
- package/dist/cron/types.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.js +3 -1
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/docker/mitm-proxy.js +10 -5
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/oauth-credentials.js +2 -2
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/pty-session.js +139 -35
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-command.js +29 -1
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/persona/compile-persona-policy.d.ts +21 -0
- package/dist/persona/compile-persona-policy.js +50 -0
- package/dist/persona/compile-persona-policy.js.map +1 -0
- package/dist/persona/persona-command.d.ts +9 -0
- package/dist/persona/persona-command.js +479 -0
- package/dist/persona/persona-command.js.map +1 -0
- package/dist/persona/persona-customizer.d.ts +23 -0
- package/dist/persona/persona-customizer.js +52 -0
- package/dist/persona/persona-customizer.js.map +1 -0
- package/dist/persona/persona-prompt.d.ts +19 -0
- package/dist/persona/persona-prompt.js +42 -0
- package/dist/persona/persona-prompt.js.map +1 -0
- package/dist/persona/resolve.d.ts +46 -0
- package/dist/persona/resolve.js +108 -0
- package/dist/persona/resolve.js.map +1 -0
- package/dist/persona/types.d.ts +40 -0
- package/dist/persona/types.js +20 -0
- package/dist/persona/types.js.map +1 -0
- package/dist/pipeline/annotate.js +8 -3
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +13 -0
- package/dist/pipeline/compile.js +27 -1
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +6 -0
- package/dist/pipeline/constitution-compiler.js +41 -5
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/constitution-customizer.d.ts +3 -0
- package/dist/pipeline/constitution-customizer.js +19 -5
- package/dist/pipeline/constitution-customizer.js.map +1 -1
- package/dist/pipeline/customizer-loop.d.ts +34 -0
- package/dist/pipeline/customizer-loop.js +167 -0
- package/dist/pipeline/customizer-loop.js.map +1 -0
- package/dist/pipeline/pipeline-runner.js +2 -9
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +8 -1
- package/dist/pipeline/pipeline-shared.js +9 -4
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/tool-annotator.js +20 -2
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.js +108 -35
- package/dist/session/index.js.map +1 -1
- package/dist/session/session-metadata.d.ts +18 -0
- package/dist/session/session-metadata.js +34 -0
- package/dist/session/session-metadata.js.map +1 -0
- package/dist/session/types.d.ts +20 -0
- package/dist/signal/signal-bot-daemon.js +8 -5
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/trusted-process/domain-utils.d.ts +2 -3
- package/dist/trusted-process/domain-utils.js +46 -34
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +19 -0
- package/dist/trusted-process/mcp-proxy-server.js +32 -12
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +2 -3
- package/dist/trusted-process/policy-engine.js +4 -42
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/types/slug.d.ts +7 -0
- package/dist/types/slug.js +14 -0
- package/dist/types/slug.js.map +1 -0
- package/dist/utils/editor.d.ts +24 -0
- package/dist/utils/editor.js +66 -0
- package/dist/utils/editor.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI entry point for `ironcurtain persona` subcommands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: create, list, compile, edit, delete, show.
|
|
5
|
+
*
|
|
6
|
+
* Follows the same patterns as job-commands.ts for interactive flows
|
|
7
|
+
* and cli-help.ts for help formatting.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { parseArgs } from 'node:util';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import { checkHelp, printHelp } from '../cli-help.js';
|
|
14
|
+
import { loadConfig } from '../config/index.js';
|
|
15
|
+
import { openEditor, openEditorForMultiline } from '../utils/editor.js';
|
|
16
|
+
import { createPersonaName } from './types.js';
|
|
17
|
+
import { getPersonaDir, getPersonaGeneratedDir, getPersonaConstitutionPath, getPersonaWorkspaceDir, getPersonaDefinitionPath, getPersonasDir, loadPersona, } from './resolve.js';
|
|
18
|
+
import { compilePersonaPolicy } from './compile-persona-policy.js';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Help specs
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
const personaSpec = {
|
|
23
|
+
name: 'ironcurtain persona',
|
|
24
|
+
description: 'Manage personas (named policy profiles)',
|
|
25
|
+
usage: ['ironcurtain persona <action> [options]'],
|
|
26
|
+
subcommands: [
|
|
27
|
+
{ name: 'create <name>', description: 'Create a new persona interactively' },
|
|
28
|
+
{ name: 'list', description: 'List all personas' },
|
|
29
|
+
{ name: 'compile <name>', description: "Compile a persona's constitution into policy" },
|
|
30
|
+
{ name: 'edit <name>', description: "Edit a persona's constitution in $EDITOR" },
|
|
31
|
+
{ name: 'delete <name>', description: 'Delete a persona (with confirmation)' },
|
|
32
|
+
{ name: 'show <name>', description: 'Show persona metadata and constitution' },
|
|
33
|
+
],
|
|
34
|
+
examples: [
|
|
35
|
+
'ironcurtain persona create exec-assistant',
|
|
36
|
+
'ironcurtain persona list',
|
|
37
|
+
'ironcurtain persona compile coder',
|
|
38
|
+
'ironcurtain persona edit exec-assistant',
|
|
39
|
+
'ironcurtain persona show coder',
|
|
40
|
+
'ironcurtain persona delete old-persona',
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Utilities
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/** Loads a persona by name string, exiting with an error if not found. */
|
|
47
|
+
function loadPersonaOrExit(nameStr) {
|
|
48
|
+
try {
|
|
49
|
+
const name = createPersonaName(nameStr);
|
|
50
|
+
return loadPersona(name);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
console.error(chalk.red(`Persona not found: ${nameStr}`));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Returns all persona names by reading the personas directory. */
|
|
58
|
+
function listPersonaNames() {
|
|
59
|
+
const dir = getPersonasDir();
|
|
60
|
+
if (!existsSync(dir))
|
|
61
|
+
return [];
|
|
62
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
63
|
+
.filter((d) => d.isDirectory())
|
|
64
|
+
.map((d) => d.name)
|
|
65
|
+
.filter((name) => {
|
|
66
|
+
try {
|
|
67
|
+
createPersonaName(name);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.map((name) => name);
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Subcommands
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
async function runCreate(nameStr, args) {
|
|
80
|
+
const { values: createValues } = parseArgs({
|
|
81
|
+
args,
|
|
82
|
+
options: {
|
|
83
|
+
description: { type: 'string' },
|
|
84
|
+
servers: { type: 'string' },
|
|
85
|
+
'no-generate': { type: 'boolean' },
|
|
86
|
+
},
|
|
87
|
+
strict: false,
|
|
88
|
+
});
|
|
89
|
+
const name = createPersonaName(nameStr);
|
|
90
|
+
const personaDir = getPersonaDir(name);
|
|
91
|
+
if (existsSync(personaDir)) {
|
|
92
|
+
console.error(chalk.red(`Persona "${name}" already exists.`));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const p = await import('@clack/prompts');
|
|
96
|
+
p.intro(`Create persona "${name}"`);
|
|
97
|
+
// 1. Description
|
|
98
|
+
let description;
|
|
99
|
+
if (createValues.description) {
|
|
100
|
+
description = createValues.description;
|
|
101
|
+
p.log.info(`Description: ${description}`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const descInput = await p.text({
|
|
105
|
+
message: "Describe this persona's purpose",
|
|
106
|
+
placeholder: 'e.g., Email triage, calendar management, and document review',
|
|
107
|
+
});
|
|
108
|
+
if (p.isCancel(descInput)) {
|
|
109
|
+
p.cancel('Cancelled.');
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
description = descInput.trim();
|
|
113
|
+
}
|
|
114
|
+
// 2. Server allowlist
|
|
115
|
+
let servers;
|
|
116
|
+
if (createValues.servers) {
|
|
117
|
+
servers = createValues.servers
|
|
118
|
+
.split(',')
|
|
119
|
+
.map((s) => s.trim())
|
|
120
|
+
.filter(Boolean);
|
|
121
|
+
p.log.info(`Servers: ${servers.join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const config = loadConfig();
|
|
125
|
+
const serverNames = Object.keys(config.mcpServers);
|
|
126
|
+
if (serverNames.length > 1) {
|
|
127
|
+
const selected = await p.multiselect({
|
|
128
|
+
message: 'Select MCP servers for this persona (filesystem is always included)',
|
|
129
|
+
options: serverNames.map((s) => ({
|
|
130
|
+
value: s,
|
|
131
|
+
label: s === 'filesystem' ? `${s} (always included)` : s,
|
|
132
|
+
hint: config.mcpServers[s].description,
|
|
133
|
+
})),
|
|
134
|
+
initialValues: serverNames,
|
|
135
|
+
});
|
|
136
|
+
if (p.isCancel(selected)) {
|
|
137
|
+
p.cancel('Cancelled.');
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}
|
|
140
|
+
// Only set servers if not all selected (undefined = all servers)
|
|
141
|
+
if (selected.length < serverNames.length) {
|
|
142
|
+
servers = selected;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Create the persona directory structure
|
|
147
|
+
mkdirSync(personaDir, { recursive: true });
|
|
148
|
+
mkdirSync(getPersonaGeneratedDir(name), { recursive: true });
|
|
149
|
+
const workspaceDir = getPersonaWorkspaceDir(name);
|
|
150
|
+
mkdirSync(workspaceDir, { recursive: true });
|
|
151
|
+
// Create empty memory file in workspace
|
|
152
|
+
const memoryPath = join(workspaceDir, 'memory.md');
|
|
153
|
+
if (!existsSync(memoryPath)) {
|
|
154
|
+
writeFileSync(memoryPath, '', 'utf-8');
|
|
155
|
+
}
|
|
156
|
+
// Save persona.json
|
|
157
|
+
const personaDef = {
|
|
158
|
+
name,
|
|
159
|
+
description,
|
|
160
|
+
createdAt: new Date().toISOString(),
|
|
161
|
+
...(servers ? { servers } : {}),
|
|
162
|
+
};
|
|
163
|
+
writeFileSync(getPersonaDefinitionPath(name), JSON.stringify(personaDef, null, 2) + '\n', 'utf-8');
|
|
164
|
+
// 3. Constitution authoring
|
|
165
|
+
let constitution;
|
|
166
|
+
const constitutionPath = getPersonaConstitutionPath(name);
|
|
167
|
+
const noGenerate = createValues['no-generate'];
|
|
168
|
+
if (!noGenerate) {
|
|
169
|
+
const shouldGenerate = await p.confirm({
|
|
170
|
+
message: 'Generate a constitution automatically from the description?',
|
|
171
|
+
initialValue: true,
|
|
172
|
+
});
|
|
173
|
+
if (p.isCancel(shouldGenerate)) {
|
|
174
|
+
p.cancel('Cancelled.');
|
|
175
|
+
process.exit(0);
|
|
176
|
+
}
|
|
177
|
+
if (shouldGenerate) {
|
|
178
|
+
const genSpinner = p.spinner();
|
|
179
|
+
genSpinner.start('Generating constitution...');
|
|
180
|
+
try {
|
|
181
|
+
const { generateConstitution } = await import('../cron/constitution-generator.js');
|
|
182
|
+
const result = await generateConstitution({
|
|
183
|
+
taskDescription: description,
|
|
184
|
+
workspacePath: workspaceDir,
|
|
185
|
+
context: 'persona',
|
|
186
|
+
onProgress: (msg) => genSpinner.message(msg),
|
|
187
|
+
});
|
|
188
|
+
genSpinner.stop('Constitution generated.');
|
|
189
|
+
p.note(result.constitution.trim(), 'Generated Constitution');
|
|
190
|
+
if (result.reasoning) {
|
|
191
|
+
p.log.info(result.reasoning);
|
|
192
|
+
}
|
|
193
|
+
const genAction = await p.select({
|
|
194
|
+
message: 'What would you like to do with the generated constitution?',
|
|
195
|
+
options: [
|
|
196
|
+
{ value: 'accept', label: 'Accept as-is' },
|
|
197
|
+
{ value: 'refine', label: 'Customize interactively' },
|
|
198
|
+
{ value: 'discard', label: 'Discard and write manually' },
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
if (p.isCancel(genAction)) {
|
|
202
|
+
p.cancel('Cancelled.');
|
|
203
|
+
process.exit(0);
|
|
204
|
+
}
|
|
205
|
+
if (genAction === 'accept') {
|
|
206
|
+
constitution = result.constitution;
|
|
207
|
+
}
|
|
208
|
+
else if (genAction === 'refine') {
|
|
209
|
+
const { runPersonaConstitutionCustomizer } = await import('./persona-customizer.js');
|
|
210
|
+
constitution =
|
|
211
|
+
(await runPersonaConstitutionCustomizer(result.constitution, description, servers)) ?? undefined;
|
|
212
|
+
}
|
|
213
|
+
// discard: falls through to editor below
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
genSpinner.stop('Generation failed.');
|
|
217
|
+
p.log.error(`Constitution generation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// 4. Fallback: open $EDITOR
|
|
222
|
+
if (!constitution) {
|
|
223
|
+
p.log.step('Opening editor for constitution...');
|
|
224
|
+
const instructions = 'Enter the persona constitution -- guiding principles for what the agent\n' +
|
|
225
|
+
'is and is not permitted to do.\n' +
|
|
226
|
+
'Lines starting with # are ignored.';
|
|
227
|
+
constitution = openEditorForMultiline(instructions);
|
|
228
|
+
}
|
|
229
|
+
if (!constitution) {
|
|
230
|
+
p.log.warn('No constitution provided. You can add one later with: ironcurtain persona edit ' + name);
|
|
231
|
+
writeFileSync(constitutionPath, '', 'utf-8');
|
|
232
|
+
p.outro(`Persona "${name}" created (no constitution -- compilation skipped).`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// 5. Write constitution and compile
|
|
236
|
+
writeFileSync(constitutionPath, constitution + '\n', 'utf-8');
|
|
237
|
+
const compileSpinner = p.spinner();
|
|
238
|
+
compileSpinner.start('Compiling policy...');
|
|
239
|
+
try {
|
|
240
|
+
await compilePersonaPolicy(name);
|
|
241
|
+
compileSpinner.stop('Policy compiled.');
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
compileSpinner.stop('Compilation failed.');
|
|
245
|
+
p.log.error(`Policy compilation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
246
|
+
p.log.warn(`Persona "${name}" was created. Fix the issue then run: ironcurtain persona compile ${name}`);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
p.outro(`Persona "${name}" created and compiled.`);
|
|
250
|
+
}
|
|
251
|
+
function runList() {
|
|
252
|
+
const names = listPersonaNames();
|
|
253
|
+
if (names.length === 0) {
|
|
254
|
+
console.error('No personas configured. Use "ironcurtain persona create <name>" to create one.');
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
for (const name of names) {
|
|
258
|
+
let description;
|
|
259
|
+
let status = 'not compiled';
|
|
260
|
+
try {
|
|
261
|
+
const persona = loadPersona(name);
|
|
262
|
+
description = persona.description;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
description = '(error reading persona.json)';
|
|
266
|
+
}
|
|
267
|
+
const compiledPath = join(getPersonaGeneratedDir(name), 'compiled-policy.json');
|
|
268
|
+
if (existsSync(compiledPath)) {
|
|
269
|
+
status = 'compiled';
|
|
270
|
+
}
|
|
271
|
+
const statusColor = status === 'compiled' ? chalk.green(status) : chalk.yellow(status);
|
|
272
|
+
console.error(` ${chalk.bold(name.padEnd(24))} ${description.slice(0, 50).padEnd(52)} ${statusColor}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async function runCompile(nameStr) {
|
|
276
|
+
const name = createPersonaName(nameStr);
|
|
277
|
+
const constitutionPath = getPersonaConstitutionPath(name);
|
|
278
|
+
if (!existsSync(constitutionPath)) {
|
|
279
|
+
console.error(chalk.red(`Persona "${name}" not found or has no constitution.md.`));
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
const constitution = readFileSync(constitutionPath, 'utf-8').trim();
|
|
283
|
+
if (!constitution) {
|
|
284
|
+
console.error(chalk.red(`Persona "${name}" has an empty constitution. Edit it first.`));
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
console.error(`Compiling policy for persona "${name}"...`);
|
|
288
|
+
try {
|
|
289
|
+
await compilePersonaPolicy(name);
|
|
290
|
+
console.error(chalk.green('Done.'));
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
console.error(chalk.red(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async function runEdit(nameStr) {
|
|
298
|
+
const name = createPersonaName(nameStr);
|
|
299
|
+
const constitutionPath = getPersonaConstitutionPath(name);
|
|
300
|
+
if (!existsSync(getPersonaDir(name))) {
|
|
301
|
+
console.error(chalk.red(`Persona "${name}" not found.`));
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
// Ensure constitution file exists
|
|
305
|
+
if (!existsSync(constitutionPath)) {
|
|
306
|
+
writeFileSync(constitutionPath, '', 'utf-8');
|
|
307
|
+
}
|
|
308
|
+
console.error('Opening constitution in editor...');
|
|
309
|
+
const changed = openEditor(constitutionPath);
|
|
310
|
+
if (!changed) {
|
|
311
|
+
console.error('No changes detected.');
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const p = await import('@clack/prompts');
|
|
315
|
+
const action = await p.select({
|
|
316
|
+
message: 'Constitution changed. What next?',
|
|
317
|
+
options: [
|
|
318
|
+
{ value: 'compile', label: 'Compile now' },
|
|
319
|
+
{ value: 'customize', label: 'Customize interactively first' },
|
|
320
|
+
{ value: 'skip', label: 'Done (skip compilation)' },
|
|
321
|
+
],
|
|
322
|
+
});
|
|
323
|
+
if (p.isCancel(action))
|
|
324
|
+
return;
|
|
325
|
+
if (action === 'compile') {
|
|
326
|
+
console.error('Compiling policy...');
|
|
327
|
+
try {
|
|
328
|
+
await compilePersonaPolicy(name);
|
|
329
|
+
console.error(chalk.green('Done.'));
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
console.error(chalk.red(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
else if (action === 'customize') {
|
|
336
|
+
const persona = loadPersona(name);
|
|
337
|
+
const currentConstitution = readFileSync(constitutionPath, 'utf-8');
|
|
338
|
+
const { runPersonaConstitutionCustomizer } = await import('./persona-customizer.js');
|
|
339
|
+
const refined = await runPersonaConstitutionCustomizer(currentConstitution, persona.description, persona.servers ? [...persona.servers] : undefined);
|
|
340
|
+
if (refined) {
|
|
341
|
+
writeFileSync(constitutionPath, refined + '\n', 'utf-8');
|
|
342
|
+
console.error('Compiling policy...');
|
|
343
|
+
try {
|
|
344
|
+
await compilePersonaPolicy(name);
|
|
345
|
+
console.error(chalk.green('Done.'));
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
console.error(chalk.red(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
async function runDelete(nameStr) {
|
|
354
|
+
const name = createPersonaName(nameStr);
|
|
355
|
+
const personaDir = getPersonaDir(name);
|
|
356
|
+
if (!existsSync(personaDir)) {
|
|
357
|
+
console.error(chalk.red(`Persona "${name}" not found.`));
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
const p = await import('@clack/prompts');
|
|
361
|
+
const confirmed = await p.confirm({
|
|
362
|
+
message: `Delete persona "${name}" and all its data?`,
|
|
363
|
+
initialValue: false,
|
|
364
|
+
});
|
|
365
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
366
|
+
console.error('Cancelled.');
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
rmSync(personaDir, { recursive: true, force: true });
|
|
370
|
+
console.error(chalk.green(`Persona "${name}" deleted.`));
|
|
371
|
+
}
|
|
372
|
+
function runShow(nameStr) {
|
|
373
|
+
const persona = loadPersonaOrExit(nameStr);
|
|
374
|
+
const name = persona.name;
|
|
375
|
+
console.error(chalk.bold(`Persona: ${name}`));
|
|
376
|
+
console.error(`Description: ${persona.description}`);
|
|
377
|
+
console.error(`Created: ${persona.createdAt}`);
|
|
378
|
+
if (persona.servers) {
|
|
379
|
+
console.error(`Servers: ${persona.servers.join(', ')}`);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
console.error('Servers: all (no filter)');
|
|
383
|
+
}
|
|
384
|
+
const compiledPath = join(getPersonaGeneratedDir(name), 'compiled-policy.json');
|
|
385
|
+
const compiled = existsSync(compiledPath);
|
|
386
|
+
console.error(`Policy: ${compiled ? chalk.green('compiled') : chalk.yellow('not compiled')}`);
|
|
387
|
+
const constitutionPath = getPersonaConstitutionPath(name);
|
|
388
|
+
if (existsSync(constitutionPath)) {
|
|
389
|
+
const constitution = readFileSync(constitutionPath, 'utf-8').trim();
|
|
390
|
+
if (constitution) {
|
|
391
|
+
console.error('');
|
|
392
|
+
console.error(chalk.bold('Constitution:'));
|
|
393
|
+
console.error(constitution);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
console.error('\nConstitution: (empty)');
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
console.error('\nConstitution: (not created)');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
// Main entry point
|
|
405
|
+
// ---------------------------------------------------------------------------
|
|
406
|
+
export async function main(args) {
|
|
407
|
+
const { values, positionals } = parseArgs({
|
|
408
|
+
args,
|
|
409
|
+
options: {
|
|
410
|
+
help: { type: 'boolean', short: 'h' },
|
|
411
|
+
},
|
|
412
|
+
allowPositionals: true,
|
|
413
|
+
strict: false,
|
|
414
|
+
});
|
|
415
|
+
const action = positionals[0];
|
|
416
|
+
if (!action || action === 'help' || (values.help && !action)) {
|
|
417
|
+
printHelp(personaSpec);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (checkHelp(values, personaSpec))
|
|
421
|
+
return;
|
|
422
|
+
switch (action) {
|
|
423
|
+
case 'create': {
|
|
424
|
+
const name = positionals[1];
|
|
425
|
+
if (!name) {
|
|
426
|
+
console.error(chalk.red('Usage: ironcurtain persona create <name>'));
|
|
427
|
+
process.exit(1);
|
|
428
|
+
}
|
|
429
|
+
await runCreate(name, args.slice(2));
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
case 'list': {
|
|
433
|
+
runList();
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
case 'compile': {
|
|
437
|
+
const name = positionals[1];
|
|
438
|
+
if (!name) {
|
|
439
|
+
console.error(chalk.red('Usage: ironcurtain persona compile <name>'));
|
|
440
|
+
process.exit(1);
|
|
441
|
+
}
|
|
442
|
+
await runCompile(name);
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
case 'edit': {
|
|
446
|
+
const name = positionals[1];
|
|
447
|
+
if (!name) {
|
|
448
|
+
console.error(chalk.red('Usage: ironcurtain persona edit <name>'));
|
|
449
|
+
process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
await runEdit(name);
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
case 'delete': {
|
|
455
|
+
const name = positionals[1];
|
|
456
|
+
if (!name) {
|
|
457
|
+
console.error(chalk.red('Usage: ironcurtain persona delete <name>'));
|
|
458
|
+
process.exit(1);
|
|
459
|
+
}
|
|
460
|
+
await runDelete(name);
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
case 'show': {
|
|
464
|
+
const name = positionals[1];
|
|
465
|
+
if (!name) {
|
|
466
|
+
console.error(chalk.red('Usage: ironcurtain persona show <name>'));
|
|
467
|
+
process.exit(1);
|
|
468
|
+
}
|
|
469
|
+
runShow(name);
|
|
470
|
+
break;
|
|
471
|
+
}
|
|
472
|
+
default: {
|
|
473
|
+
console.error(chalk.red(`Unknown persona action: ${action}`));
|
|
474
|
+
printHelp(personaSpec);
|
|
475
|
+
process.exit(1);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=persona-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-command.js","sourceRoot":"","sources":["../../src/persona/persona-command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAA4C,MAAM,YAAY,CAAC;AACzF,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,WAAW,GAAgB;IAC/B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,yCAAyC;IACtD,KAAK,EAAE,CAAC,wCAAwC,CAAC;IACjD,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,oCAAoC,EAAE;QAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE;QAClD,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,8CAA8C,EAAE;QACvF,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAChF,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC9E,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,wCAAwC,EAAE;KAC/E;IACD,QAAQ,EAAE;QACR,2CAA2C;QAC3C,0BAA0B;QAC1B,mCAAmC;QACnC,yCAAyC;QACzC,gCAAgC;QAChC,wCAAwC;KACzC;CACF,CAAC;AAEF,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,0EAA0E;AAC1E,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,IAAI,CAAC;YACH,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAmB,CAAC,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,IAAc;IACtD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;QACzC,IAAI;QACJ,OAAO,EAAE;YACP,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC/B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC,CAAC,KAAK,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;IAEpC,iBAAiB;IACjB,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QAC7B,WAAW,GAAG,YAAY,CAAC,WAAqB,CAAC;QACjD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YAC7B,OAAO,EAAE,iCAAiC;YAC1C,WAAW,EAAE,8DAA8D;SAC5E,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,sBAAsB;IACtB,IAAI,OAA6B,CAAC;IAClC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,GAAI,YAAY,CAAC,OAAkB;aACvC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,WAAW,CAAC;gBACnC,OAAO,EAAE,qEAAqE;gBAC9E,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/B,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;oBACxD,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW;iBACvC,CAAC,CAAC;gBACH,aAAa,EAAE,WAAW;aAC3B,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,iEAAiE;YACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gBACzC,OAAO,GAAG,QAAQ,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,wCAAwC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,oBAAoB;IACpB,MAAM,UAAU,GAAsB;QACpC,IAAI;QACJ,WAAW;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;IACF,aAAa,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEnG,4BAA4B;IAC5B,IAAI,YAAgC,CAAC;IACrC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAwB,CAAC;IAEtE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YACrC,OAAO,EAAE,6DAA6D;YACtE,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,UAAU,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACnF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;oBACxC,eAAe,EAAE,WAAW;oBAC5B,aAAa,EAAE,YAAY;oBAC3B,OAAO,EAAE,SAAS;oBAClB,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;iBAC7C,CAAC,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAC3C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,wBAAwB,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;oBAC/B,OAAO,EAAE,4DAA4D;oBACrE,OAAO,EAAE;wBACP,EAAE,KAAK,EAAE,QAAiB,EAAE,KAAK,EAAE,cAAc,EAAE;wBACnD,EAAE,KAAK,EAAE,QAAiB,EAAE,KAAK,EAAE,yBAAyB,EAAE;wBAC9D,EAAE,KAAK,EAAE,SAAkB,EAAE,KAAK,EAAE,4BAA4B,EAAE;qBACnE;iBACF,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBACrC,CAAC;qBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,EAAE,gCAAgC,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;oBACrF,YAAY;wBACV,CAAC,MAAM,gCAAgC,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC;gBACrG,CAAC;gBACD,yCAAyC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,MAAM,YAAY,GAChB,2EAA2E;YAC3E,kCAAkC;YAClC,oCAAoC,CAAC;QACvC,YAAY,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iFAAiF,GAAG,IAAI,CAAC,CAAC;QACrG,aAAa,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,qDAAqD,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,oCAAoC;IACpC,aAAa,CAAC,gBAAgB,EAAE,YAAY,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,cAAc,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,sEAAsE,IAAI,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,OAAO;IACd,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;QAChG,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAmB,CAAC;QACxB,IAAI,MAAM,GAAG,cAAc,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,8BAA8B,CAAC;QAC/C,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAChF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,UAAU,CAAC;QACtB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe;IACvC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,wCAAwC,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,6CAA6C,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAkB,EAAE,KAAK,EAAE,aAAa,EAAE;YACnD,EAAE,KAAK,EAAE,WAAoB,EAAE,KAAK,EAAE,+BAA+B,EAAE;YACvE,EAAE,KAAK,EAAE,MAAe,EAAE,KAAK,EAAE,yBAAyB,EAAE;SAC7D;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO;IAE/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,mBAAmB,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,EAAE,gCAAgC,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,MAAM,gCAAgC,CACpD,mBAAmB,EACnB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CACnD,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,aAAa,CAAC,gBAAgB,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,mBAAmB,IAAI,qBAAqB;QACrD,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,gBAAgB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,WAAW,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAE9F,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI;QACJ,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAE9B,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,SAAS,CAAC,WAAW,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,MAA4B,EAAE,WAAW,CAAC;QAAE,OAAO;IAEjE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9D,SAAS,CAAC,WAAW,CAAC,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive LLM-assisted constitution customizer for personas.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around the shared customizer loop, adding
|
|
5
|
+
* persona-specific context to the LLM system prompt.
|
|
6
|
+
*/
|
|
7
|
+
import type { GitHubIdentity } from '../pipeline/github-identity.js';
|
|
8
|
+
import type { ToolAnnotation } from '../pipeline/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Builds a system prompt for the persona constitution customizer.
|
|
11
|
+
* Extends the base customizer prompt with persona-specific context.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildPersonaCustomizerSystemPrompt(baseConstitution: string, toolAnnotations: ToolAnnotation[], personaDescription: string, serverAllowlist?: readonly string[], githubIdentity?: GitHubIdentity | null): string;
|
|
14
|
+
/**
|
|
15
|
+
* Runs an interactive constitution customizer session for a persona.
|
|
16
|
+
* Operates on an in-memory constitution string (not the global file).
|
|
17
|
+
*
|
|
18
|
+
* @param initialConstitution - Starting constitution text (from generator or existing)
|
|
19
|
+
* @param personaDescription - The persona description (context for the LLM)
|
|
20
|
+
* @param serverAllowlist - Optional server allowlist (context for the LLM)
|
|
21
|
+
* @returns The final constitution text, or undefined if the user cancelled
|
|
22
|
+
*/
|
|
23
|
+
export declare function runPersonaConstitutionCustomizer(initialConstitution: string, personaDescription: string, serverAllowlist?: readonly string[]): Promise<string | undefined>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive LLM-assisted constitution customizer for personas.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around the shared customizer loop, adding
|
|
5
|
+
* persona-specific context to the LLM system prompt.
|
|
6
|
+
*/
|
|
7
|
+
import { buildSystemPrompt } from '../pipeline/constitution-customizer.js';
|
|
8
|
+
import { runConstitutionCustomizerLoop } from '../pipeline/customizer-loop.js';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Persona-Scoped System Prompt
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Builds a system prompt for the persona constitution customizer.
|
|
14
|
+
* Extends the base customizer prompt with persona-specific context.
|
|
15
|
+
*/
|
|
16
|
+
export function buildPersonaCustomizerSystemPrompt(baseConstitution, toolAnnotations, personaDescription, serverAllowlist, githubIdentity) {
|
|
17
|
+
const basePrompt = buildSystemPrompt(baseConstitution, toolAnnotations, githubIdentity);
|
|
18
|
+
const serverContext = serverAllowlist
|
|
19
|
+
? `\nThis persona only has access to these MCP servers: ${serverAllowlist.join(', ')}.`
|
|
20
|
+
: '';
|
|
21
|
+
return `${basePrompt}
|
|
22
|
+
|
|
23
|
+
## Persona Context
|
|
24
|
+
|
|
25
|
+
This constitution is for a persona with the following purpose:
|
|
26
|
+
|
|
27
|
+
${personaDescription}
|
|
28
|
+
${serverContext}
|
|
29
|
+
|
|
30
|
+
Focus your suggestions on what this persona needs. Grant the minimum
|
|
31
|
+
permissions required for the persona's purpose.`;
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Main Entry Point
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Runs an interactive constitution customizer session for a persona.
|
|
38
|
+
* Operates on an in-memory constitution string (not the global file).
|
|
39
|
+
*
|
|
40
|
+
* @param initialConstitution - Starting constitution text (from generator or existing)
|
|
41
|
+
* @param personaDescription - The persona description (context for the LLM)
|
|
42
|
+
* @param serverAllowlist - Optional server allowlist (context for the LLM)
|
|
43
|
+
* @returns The final constitution text, or undefined if the user cancelled
|
|
44
|
+
*/
|
|
45
|
+
export async function runPersonaConstitutionCustomizer(initialConstitution, personaDescription, serverAllowlist) {
|
|
46
|
+
return runConstitutionCustomizerLoop(initialConstitution, (ctx) => buildPersonaCustomizerSystemPrompt('', ctx.annotations, personaDescription, serverAllowlist, ctx.githubIdentity), {
|
|
47
|
+
stepName: 'persona-customize-policy',
|
|
48
|
+
noteTitle: 'Current Persona Constitution',
|
|
49
|
+
refinePlaceholder: 'e.g., "also allow fetching from news sites"',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=persona-customizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-customizer.js","sourceRoot":"","sources":["../../src/persona/persona-customizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAA8B,MAAM,gCAAgC,CAAC;AAI3G,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAChD,gBAAwB,EACxB,eAAiC,EACjC,kBAA0B,EAC1B,eAAmC,EACnC,cAAsC;IAEtC,MAAM,UAAU,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IAExF,MAAM,aAAa,GAAG,eAAe;QACnC,CAAC,CAAC,wDAAwD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACvF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,GAAG,UAAU;;;;;;EAMpB,kBAAkB;EAClB,aAAa;;;gDAGiC,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,mBAA2B,EAC3B,kBAA0B,EAC1B,eAAmC;IAEnC,OAAO,6BAA6B,CAClC,mBAAmB,EACnB,CAAC,GAA0B,EAAE,EAAE,CAC7B,kCAAkC,CAAC,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,CAAC,cAAc,CAAC,EAClH;QACE,QAAQ,EAAE,0BAA0B;QACpC,SAAS,EAAE,8BAA8B;QACzC,iBAAiB,EAAE,6CAA6C;KACjE,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona system prompt augmentation.
|
|
3
|
+
*
|
|
4
|
+
* Builds the system prompt fragment injected when a session is
|
|
5
|
+
* created with a persona. Includes the persona description and
|
|
6
|
+
* the contents of the persistent memory file (workspace/memory.md).
|
|
7
|
+
*/
|
|
8
|
+
import type { PersonaDefinition } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Builds the system prompt augmentation for a persona session.
|
|
11
|
+
*
|
|
12
|
+
* Includes the persona's description and the current contents of
|
|
13
|
+
* the memory file. The agent is instructed to read and update the
|
|
14
|
+
* memory file across sessions.
|
|
15
|
+
*
|
|
16
|
+
* @param persona - The persona definition.
|
|
17
|
+
* @param memoryPath - Absolute path to the memory file (workspace/memory.md).
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildPersonaSystemPromptAugmentation(persona: PersonaDefinition, memoryPath: string): string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona system prompt augmentation.
|
|
3
|
+
*
|
|
4
|
+
* Builds the system prompt fragment injected when a session is
|
|
5
|
+
* created with a persona. Includes the persona description and
|
|
6
|
+
* the contents of the persistent memory file (workspace/memory.md).
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
/**
|
|
10
|
+
* Builds the system prompt augmentation for a persona session.
|
|
11
|
+
*
|
|
12
|
+
* Includes the persona's description and the current contents of
|
|
13
|
+
* the memory file. The agent is instructed to read and update the
|
|
14
|
+
* memory file across sessions.
|
|
15
|
+
*
|
|
16
|
+
* @param persona - The persona definition.
|
|
17
|
+
* @param memoryPath - Absolute path to the memory file (workspace/memory.md).
|
|
18
|
+
*/
|
|
19
|
+
export function buildPersonaSystemPromptAugmentation(persona, memoryPath) {
|
|
20
|
+
const memoryContent = existsSync(memoryPath) ? readFileSync(memoryPath, 'utf-8') : '';
|
|
21
|
+
return `
|
|
22
|
+
## Persona: ${persona.name}
|
|
23
|
+
|
|
24
|
+
${persona.description}
|
|
25
|
+
|
|
26
|
+
## Persistent Memory
|
|
27
|
+
|
|
28
|
+
You have a persistent memory file at: ${memoryPath}
|
|
29
|
+
This file survives across sessions. Use it to remember important context:
|
|
30
|
+
- User preferences and patterns
|
|
31
|
+
- Ongoing tasks and their status
|
|
32
|
+
- Key decisions and their reasoning
|
|
33
|
+
- Names, dates, and recurring items
|
|
34
|
+
|
|
35
|
+
Read this file at the start of each session to recall prior context.
|
|
36
|
+
Before the session ends, update it with anything worth remembering.
|
|
37
|
+
Keep it concise and organized — this is your long-term memory.
|
|
38
|
+
|
|
39
|
+
${memoryContent ? `### Current Memory Contents\n\n${memoryContent}` : 'The memory file is currently empty — this is your first session.'}
|
|
40
|
+
`.trim();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=persona-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-prompt.js","sourceRoot":"","sources":["../../src/persona/persona-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGnD;;;;;;;;;GASG;AACH,MAAM,UAAU,oCAAoC,CAAC,OAA0B,EAAE,UAAkB;IACjG,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,OAAO;cACK,OAAO,CAAC,IAAI;;EAExB,OAAO,CAAC,WAAW;;;;wCAImB,UAAU;;;;;;;;;;;EAWhD,aAAa,CAAC,CAAC,CAAC,kCAAkC,aAAa,EAAE,CAAC,CAAC,CAAC,kEAAkE;CACvI,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|