@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.
Files changed (95) hide show
  1. package/README.md +24 -100
  2. package/dist/cli.js +6 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/constitution-readonly.md +21 -0
  5. package/dist/config/generated-readonly/compiled-policy.json +468 -0
  6. package/dist/config/paths.d.ts +17 -0
  7. package/dist/config/paths.js +23 -0
  8. package/dist/config/paths.js.map +1 -1
  9. package/dist/cron/constitution-generator.d.ts +60 -0
  10. package/dist/cron/constitution-generator.js +217 -0
  11. package/dist/cron/constitution-generator.js.map +1 -0
  12. package/dist/cron/job-commands.js +104 -41
  13. package/dist/cron/job-commands.js.map +1 -1
  14. package/dist/cron/job-customizer.d.ts +22 -0
  15. package/dist/cron/job-customizer.js +47 -0
  16. package/dist/cron/job-customizer.js.map +1 -0
  17. package/dist/cron/types.d.ts +8 -0
  18. package/dist/cron/types.js +3 -6
  19. package/dist/cron/types.js.map +1 -1
  20. package/dist/daemon/ironcurtain-daemon.js +3 -1
  21. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  22. package/dist/docker/mitm-proxy.js +10 -5
  23. package/dist/docker/mitm-proxy.js.map +1 -1
  24. package/dist/docker/oauth-credentials.js +2 -2
  25. package/dist/docker/oauth-credentials.js.map +1 -1
  26. package/dist/docker/pty-session.js +139 -35
  27. package/dist/docker/pty-session.js.map +1 -1
  28. package/dist/index.js +13 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/mux/mux-command.js +29 -1
  31. package/dist/mux/mux-command.js.map +1 -1
  32. package/dist/persona/compile-persona-policy.d.ts +21 -0
  33. package/dist/persona/compile-persona-policy.js +50 -0
  34. package/dist/persona/compile-persona-policy.js.map +1 -0
  35. package/dist/persona/persona-command.d.ts +9 -0
  36. package/dist/persona/persona-command.js +479 -0
  37. package/dist/persona/persona-command.js.map +1 -0
  38. package/dist/persona/persona-customizer.d.ts +23 -0
  39. package/dist/persona/persona-customizer.js +52 -0
  40. package/dist/persona/persona-customizer.js.map +1 -0
  41. package/dist/persona/persona-prompt.d.ts +19 -0
  42. package/dist/persona/persona-prompt.js +42 -0
  43. package/dist/persona/persona-prompt.js.map +1 -0
  44. package/dist/persona/resolve.d.ts +46 -0
  45. package/dist/persona/resolve.js +108 -0
  46. package/dist/persona/resolve.js.map +1 -0
  47. package/dist/persona/types.d.ts +40 -0
  48. package/dist/persona/types.js +20 -0
  49. package/dist/persona/types.js.map +1 -0
  50. package/dist/pipeline/annotate.js +8 -3
  51. package/dist/pipeline/annotate.js.map +1 -1
  52. package/dist/pipeline/compile.d.ts +13 -0
  53. package/dist/pipeline/compile.js +27 -1
  54. package/dist/pipeline/compile.js.map +1 -1
  55. package/dist/pipeline/constitution-compiler.d.ts +6 -0
  56. package/dist/pipeline/constitution-compiler.js +41 -5
  57. package/dist/pipeline/constitution-compiler.js.map +1 -1
  58. package/dist/pipeline/constitution-customizer.d.ts +3 -0
  59. package/dist/pipeline/constitution-customizer.js +19 -5
  60. package/dist/pipeline/constitution-customizer.js.map +1 -1
  61. package/dist/pipeline/customizer-loop.d.ts +34 -0
  62. package/dist/pipeline/customizer-loop.js +167 -0
  63. package/dist/pipeline/customizer-loop.js.map +1 -0
  64. package/dist/pipeline/pipeline-runner.js +2 -9
  65. package/dist/pipeline/pipeline-runner.js.map +1 -1
  66. package/dist/pipeline/pipeline-shared.d.ts +8 -1
  67. package/dist/pipeline/pipeline-shared.js +9 -4
  68. package/dist/pipeline/pipeline-shared.js.map +1 -1
  69. package/dist/pipeline/tool-annotator.js +20 -2
  70. package/dist/pipeline/tool-annotator.js.map +1 -1
  71. package/dist/session/index.d.ts +10 -0
  72. package/dist/session/index.js +108 -35
  73. package/dist/session/index.js.map +1 -1
  74. package/dist/session/session-metadata.d.ts +18 -0
  75. package/dist/session/session-metadata.js +34 -0
  76. package/dist/session/session-metadata.js.map +1 -0
  77. package/dist/session/types.d.ts +20 -0
  78. package/dist/signal/signal-bot-daemon.js +8 -5
  79. package/dist/signal/signal-bot-daemon.js.map +1 -1
  80. package/dist/trusted-process/domain-utils.d.ts +2 -3
  81. package/dist/trusted-process/domain-utils.js +46 -34
  82. package/dist/trusted-process/domain-utils.js.map +1 -1
  83. package/dist/trusted-process/mcp-proxy-server.d.ts +19 -0
  84. package/dist/trusted-process/mcp-proxy-server.js +32 -12
  85. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  86. package/dist/trusted-process/policy-engine.d.ts +2 -3
  87. package/dist/trusted-process/policy-engine.js +4 -42
  88. package/dist/trusted-process/policy-engine.js.map +1 -1
  89. package/dist/types/slug.d.ts +7 -0
  90. package/dist/types/slug.js +14 -0
  91. package/dist/types/slug.js.map +1 -0
  92. package/dist/utils/editor.d.ts +24 -0
  93. package/dist/utils/editor.js +66 -0
  94. package/dist/utils/editor.js.map +1 -0
  95. 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":"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"}
@@ -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"}