@provos/ironcurtain 0.6.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 +29 -86
- package/dist/cli-help.d.ts +63 -0
- package/dist/cli-help.js +102 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.js +79 -56
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +136 -2
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/constitution-readonly.md +21 -0
- package/dist/config/generated/tool-annotations.json +487 -338
- package/dist/config/generated-readonly/compiled-policy.json +468 -0
- package/dist/config/index.d.ts +21 -1
- package/dist/config/index.js +12 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -8
- package/dist/config/paths.d.ts +47 -0
- package/dist/config/paths.js +81 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/tool-description-hints.json +15 -0
- package/dist/config/types.d.ts +7 -0
- package/dist/config/user-config.d.ts +21 -0
- package/dist/config/user-config.js +8 -0
- package/dist/config/user-config.js.map +1 -1
- package/dist/cron/compile-task-policy.d.ts +17 -0
- package/dist/cron/compile-task-policy.js +39 -0
- package/dist/cron/compile-task-policy.js.map +1 -0
- 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/cron-scheduler.d.ts +65 -0
- package/dist/cron/cron-scheduler.js +184 -0
- package/dist/cron/cron-scheduler.js.map +1 -0
- package/dist/cron/file-lock.d.ts +41 -0
- package/dist/cron/file-lock.js +156 -0
- package/dist/cron/file-lock.js.map +1 -0
- package/dist/cron/format-utils.d.ts +18 -0
- package/dist/cron/format-utils.js +145 -0
- package/dist/cron/format-utils.js.map +1 -0
- package/dist/cron/git-sync.d.ts +22 -0
- package/dist/cron/git-sync.js +121 -0
- package/dist/cron/git-sync.js.map +1 -0
- package/dist/cron/headless-transport.d.ts +27 -0
- package/dist/cron/headless-transport.js +43 -0
- package/dist/cron/headless-transport.js.map +1 -0
- package/dist/cron/job-commands.d.ts +39 -0
- package/dist/cron/job-commands.js +585 -0
- package/dist/cron/job-commands.js.map +1 -0
- 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/job-store.d.ts +35 -0
- package/dist/cron/job-store.js +111 -0
- package/dist/cron/job-store.js.map +1 -0
- package/dist/cron/types.d.ts +135 -0
- package/dist/cron/types.js +22 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/daemon/control-socket.d.ts +127 -0
- package/dist/daemon/control-socket.js +261 -0
- package/dist/daemon/control-socket.js.map +1 -0
- package/dist/daemon/daemon-command.d.ts +13 -0
- package/dist/daemon/daemon-command.js +230 -0
- package/dist/daemon/daemon-command.js.map +1 -0
- package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
- package/dist/daemon/ironcurtain-daemon.js +550 -0
- package/dist/daemon/ironcurtain-daemon.js.map +1 -0
- package/dist/docker/adapters/claude-code.js +7 -47
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/goose.d.ts +58 -0
- package/dist/docker/adapters/goose.js +250 -0
- package/dist/docker/adapters/goose.js.map +1 -0
- package/dist/docker/adapters/shared-scripts.d.ts +29 -0
- package/dist/docker/adapters/shared-scripts.js +80 -0
- package/dist/docker/adapters/shared-scripts.js.map +1 -0
- package/dist/docker/agent-adapter.d.ts +12 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.d.ts +6 -1
- package/dist/docker/agent-registry.js +10 -1
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +2 -25
- package/dist/docker/docker-agent-session.js +7 -106
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +8 -0
- package/dist/docker/docker-infrastructure.js +12 -11
- package/dist/docker/docker-infrastructure.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 +146 -39
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/escalation/escalation-watcher.d.ts +2 -0
- package/dist/escalation/escalation-watcher.js +3 -0
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/escalation/session-registry.js +1 -14
- package/dist/escalation/session-registry.js.map +1 -1
- package/dist/index.js +43 -5
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-app.js +11 -6
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.js +49 -10
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +5 -0
- package/dist/mux/mux-input-handler.js +64 -9
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +20 -0
- package/dist/mux/mux-renderer.js +127 -35
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/mux-splash.js +2 -1
- package/dist/mux/mux-splash.js.map +1 -1
- package/dist/mux/paste-interceptor.d.ts +22 -0
- package/dist/mux/paste-interceptor.js +143 -0
- package/dist/mux/paste-interceptor.js.map +1 -0
- package/dist/mux/pty-bridge.js +1 -1
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/types.d.ts +8 -1
- package/dist/mux/types.js +17 -5
- package/dist/mux/types.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 +10 -4
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +14 -31
- package/dist/pipeline/compile.js +50 -563
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +6 -0
- package/dist/pipeline/constitution-compiler.js +42 -6
- 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/mcp-connections.d.ts +16 -0
- package/dist/pipeline/mcp-connections.js +61 -0
- package/dist/pipeline/mcp-connections.js.map +1 -0
- package/dist/pipeline/pipeline-runner.d.ts +86 -0
- package/dist/pipeline/pipeline-runner.js +547 -0
- package/dist/pipeline/pipeline-runner.js.map +1 -0
- package/dist/pipeline/pipeline-shared.d.ts +37 -3
- package/dist/pipeline/pipeline-shared.js +77 -16
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +38 -12
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.js +2 -1
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/tool-annotator.d.ts +3 -3
- package/dist/pipeline/tool-annotator.js +114 -4
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/pipeline/types.d.ts +52 -0
- package/dist/sandbox/index.js +36 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/session/agent-session.d.ts +3 -0
- package/dist/session/agent-session.js +10 -1
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.js +134 -12
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.js +26 -6
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +14 -0
- package/dist/session/prompts.js +39 -2
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +105 -0
- package/dist/session/session-manager.js +134 -0
- package/dist/session/session-manager.js.map +1 -0
- 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 +47 -0
- package/dist/session/workspace-validation.d.ts +2 -0
- package/dist/session/workspace-validation.js +6 -5
- package/dist/session/workspace-validation.js.map +1 -1
- package/dist/signal/bot-command.d.ts +2 -0
- package/dist/signal/bot-command.js +8 -0
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/format.d.ts +27 -0
- package/dist/signal/format.js +59 -0
- package/dist/signal/format.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +27 -25
- package/dist/signal/signal-bot-daemon.js +153 -135
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.js +63 -19
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/signal/signal-transport.js +3 -8
- package/dist/signal/signal-transport.js.map +1 -1
- package/dist/trusted-process/domain-utils.d.ts +37 -4
- package/dist/trusted-process/domain-utils.js +130 -11
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/index.js +6 -2
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/mcp-client-manager.js +11 -5
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +21 -0
- package/dist/trusted-process/mcp-proxy-server.js +91 -28
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
- package/dist/trusted-process/permissive-output-validator.js +10 -0
- package/dist/trusted-process/permissive-output-validator.js.map +1 -0
- package/dist/trusted-process/policy-engine.d.ts +29 -7
- package/dist/trusted-process/policy-engine.js +149 -92
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/tool-description-hints.d.ts +19 -0
- package/dist/trusted-process/tool-description-hints.js +53 -0
- package/dist/trusted-process/tool-description-hints.js.map +1 -0
- package/dist/types/argument-roles.d.ts +33 -1
- package/dist/types/argument-roles.js +129 -1
- package/dist/types/argument-roles.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/docker/Dockerfile.goose +34 -0
- package/docker/entrypoint-goose.sh +30 -0
- package/package.json +1 -1
- package/src/config/generated/tool-annotations.json +487 -338
- package/src/config/mcp-servers.json +2 -8
package/dist/mux/types.js
CHANGED
|
@@ -5,28 +5,39 @@
|
|
|
5
5
|
const TAB_BAR_ROWS = 1;
|
|
6
6
|
const FOOTER_ROWS = 2;
|
|
7
7
|
const HINT_BAR_ROWS = 1;
|
|
8
|
-
const
|
|
8
|
+
const MIN_INPUT_LINE_ROWS = 1;
|
|
9
|
+
export const MAX_INPUT_LINE_ROWS = 6;
|
|
9
10
|
const ESCALATION_ROWS_PER_ITEM = 4;
|
|
10
11
|
const MAX_ESCALATION_PANEL_ROWS = 12;
|
|
11
|
-
const MAX_OVERLAY_ROWS = 14;
|
|
12
12
|
/**
|
|
13
13
|
* Calculates the screen layout.
|
|
14
14
|
*
|
|
15
15
|
* The PTY viewport is CONSTANT: totalRows - TAB_BAR_ROWS - FOOTER_ROWS.
|
|
16
16
|
* In command mode, the overlay paints over the bottom rows of the PTY viewport.
|
|
17
|
+
*
|
|
18
|
+
* @param inputLineRows - Number of input rows requested (default 1). Clamped
|
|
19
|
+
* between MIN_INPUT_LINE_ROWS and MAX_INPUT_LINE_ROWS, then further clamped
|
|
20
|
+
* by available viewport space.
|
|
17
21
|
*/
|
|
18
|
-
export function calculateLayout(totalRows, mode, pendingCount) {
|
|
22
|
+
export function calculateLayout(totalRows, mode, pendingCount, inputLineRows = 1) {
|
|
19
23
|
// Ensure footer fits on screen; degrade gracefully on tiny terminals
|
|
20
24
|
const footerRows = Math.min(FOOTER_ROWS, Math.max(0, totalRows - TAB_BAR_ROWS));
|
|
21
25
|
const ptyViewportRows = Math.max(1, totalRows - TAB_BAR_ROWS - footerRows);
|
|
22
26
|
let overlayRows = 0;
|
|
23
27
|
let escalationPanelRows = 0;
|
|
28
|
+
let allocatedInputRows = MIN_INPUT_LINE_ROWS;
|
|
24
29
|
if (mode === 'command') {
|
|
25
30
|
if (pendingCount > 0) {
|
|
26
31
|
escalationPanelRows = Math.min(pendingCount * ESCALATION_ROWS_PER_ITEM, MAX_ESCALATION_PANEL_ROWS);
|
|
27
32
|
}
|
|
28
|
-
|
|
29
|
-
|
|
33
|
+
const actualInputRows = Math.min(Math.max(inputLineRows, MIN_INPUT_LINE_ROWS), MAX_INPUT_LINE_ROWS);
|
|
34
|
+
// Ensure overlay fits at least the hint bar + 1 input row, even on tiny terminals.
|
|
35
|
+
const minOverlay = Math.min(ptyViewportRows, HINT_BAR_ROWS + MIN_INPUT_LINE_ROWS);
|
|
36
|
+
overlayRows = Math.max(minOverlay, Math.min(escalationPanelRows + HINT_BAR_ROWS + actualInputRows, Math.floor(ptyViewportRows / 2), ptyViewportRows));
|
|
37
|
+
// Clamp escalation panel to fit within overlay budget, reserving
|
|
38
|
+
// space for the hint bar and at least one input row.
|
|
39
|
+
escalationPanelRows = Math.min(escalationPanelRows, Math.max(0, overlayRows - HINT_BAR_ROWS - MIN_INPUT_LINE_ROWS));
|
|
40
|
+
allocatedInputRows = Math.max(MIN_INPUT_LINE_ROWS, overlayRows - escalationPanelRows - HINT_BAR_ROWS);
|
|
30
41
|
}
|
|
31
42
|
const pickerRows = mode === 'picker' ? Math.min(Math.floor(ptyViewportRows / 2), ptyViewportRows) : 0;
|
|
32
43
|
const pickerY = TAB_BAR_ROWS + ptyViewportRows - pickerRows;
|
|
@@ -40,6 +51,7 @@ export function calculateLayout(totalRows, mode, pendingCount) {
|
|
|
40
51
|
escalationPanelRows,
|
|
41
52
|
pickerRows,
|
|
42
53
|
pickerY,
|
|
54
|
+
inputLineRows: mode === 'command' ? allocatedInputRows : 1,
|
|
43
55
|
};
|
|
44
56
|
}
|
|
45
57
|
//# sourceMappingURL=types.js.map
|
package/dist/mux/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mux/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mux/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsEH,mBAAmB;AACnB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,IAAe,EAAE,YAAoB,EAAE,aAAa,GAAG,CAAC;IACzG,qEAAqE;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;IAE3E,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,kBAAkB,GAAG,mBAAmB,CAAC;IAE7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,wBAAwB,EAAE,yBAAyB,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACpG,mFAAmF;QACnF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,GAAG,mBAAmB,CAAC,CAAC;QAClF,WAAW,GAAG,IAAI,CAAC,GAAG,CACpB,UAAU,EACV,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,aAAa,GAAG,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAClH,CAAC;QACF,iEAAiE;QACjE,qDAAqD;QACrD,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;QACpH,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,WAAW,GAAG,mBAAmB,GAAG,aAAa,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,YAAY,GAAG,eAAe,GAAG,UAAU,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,YAAY;QAC1B,eAAe;QACf,OAAO,EAAE,YAAY,GAAG,eAAe;QACvC,WAAW;QACX,QAAQ,EAAE,YAAY,GAAG,eAAe,GAAG,WAAW;QACtD,mBAAmB;QACnB,UAAU;QACV,OAAO;QACP,aAAa,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona policy compiler -- compiles a persona's constitution into
|
|
3
|
+
* enforceable policy rules.
|
|
4
|
+
*
|
|
5
|
+
* Thin wrapper over PipelineRunner, following the same pattern as
|
|
6
|
+
* compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
|
|
7
|
+
* difference is constitutionKind: 'constitution' (broad principles)
|
|
8
|
+
* vs 'task-policy' (task-specific whitelist).
|
|
9
|
+
*/
|
|
10
|
+
import type { PersonaName } from './types.js';
|
|
11
|
+
import type { CompiledPolicyFile } from '../pipeline/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Compiles a persona's constitution.md into policy rules, writing
|
|
14
|
+
* output to the persona's generated/ directory.
|
|
15
|
+
*
|
|
16
|
+
* Reads tool annotations from the global generated dir (annotations
|
|
17
|
+
* are server-level, not persona-level). When the persona has a server
|
|
18
|
+
* allowlist, only filtered servers are passed to the pipeline so the
|
|
19
|
+
* compiled policy only references relevant tools.
|
|
20
|
+
*/
|
|
21
|
+
export declare function compilePersonaPolicy(name: PersonaName): Promise<CompiledPolicyFile>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona policy compiler -- compiles a persona's constitution into
|
|
3
|
+
* enforceable policy rules.
|
|
4
|
+
*
|
|
5
|
+
* Thin wrapper over PipelineRunner, following the same pattern as
|
|
6
|
+
* compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
|
|
7
|
+
* difference is constitutionKind: 'constitution' (broad principles)
|
|
8
|
+
* vs 'task-policy' (task-specific whitelist).
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from 'node:fs';
|
|
11
|
+
import { PipelineRunner, createPipelineModels } from '../pipeline/pipeline-runner.js';
|
|
12
|
+
import { loadConfig, getPackageGeneratedDir } from '../config/index.js';
|
|
13
|
+
import { getUserGeneratedDir } from '../config/paths.js';
|
|
14
|
+
import { getPersonaConstitutionPath, getPersonaGeneratedDir, loadPersona, applyServerAllowlist } from './resolve.js';
|
|
15
|
+
/**
|
|
16
|
+
* Compiles a persona's constitution.md into policy rules, writing
|
|
17
|
+
* output to the persona's generated/ directory.
|
|
18
|
+
*
|
|
19
|
+
* Reads tool annotations from the global generated dir (annotations
|
|
20
|
+
* are server-level, not persona-level). When the persona has a server
|
|
21
|
+
* allowlist, only filtered servers are passed to the pipeline so the
|
|
22
|
+
* compiled policy only references relevant tools.
|
|
23
|
+
*/
|
|
24
|
+
export async function compilePersonaPolicy(name) {
|
|
25
|
+
const config = loadConfig();
|
|
26
|
+
const outputDir = getPersonaGeneratedDir(name);
|
|
27
|
+
const constitutionPath = getPersonaConstitutionPath(name);
|
|
28
|
+
const constitutionText = readFileSync(constitutionPath, 'utf-8');
|
|
29
|
+
const annotationsDir = getUserGeneratedDir();
|
|
30
|
+
const models = await createPipelineModels(outputDir);
|
|
31
|
+
const runner = new PipelineRunner(models);
|
|
32
|
+
// Apply server allowlist if the persona specifies one
|
|
33
|
+
let mcpServers = config.mcpServers;
|
|
34
|
+
const persona = loadPersona(name);
|
|
35
|
+
if (persona.servers) {
|
|
36
|
+
mcpServers = applyServerAllowlist(mcpServers, persona.servers);
|
|
37
|
+
}
|
|
38
|
+
return runner.run({
|
|
39
|
+
constitutionInput: constitutionText,
|
|
40
|
+
constitutionKind: 'constitution',
|
|
41
|
+
outputDir,
|
|
42
|
+
toolAnnotationsDir: annotationsDir,
|
|
43
|
+
toolAnnotationsFallbackDir: getPackageGeneratedDir(),
|
|
44
|
+
allowedDirectory: config.allowedDirectory,
|
|
45
|
+
protectedPaths: config.protectedPaths,
|
|
46
|
+
mcpServers,
|
|
47
|
+
includeHandwrittenScenarios: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=compile-persona-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-persona-policy.js","sourceRoot":"","sources":["../../src/persona/compile-persona-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIrH;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAiB;IAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAE1C,sDAAsD;IACtD,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,UAAU,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,iBAAiB,EAAE,gBAAgB;QACnC,gBAAgB,EAAE,cAAc;QAChC,SAAS;QACT,kBAAkB,EAAE,cAAc;QAClC,0BAA0B,EAAE,sBAAsB,EAAE;QACpD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,UAAU;QACV,2BAA2B,EAAE,KAAK;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
export declare function main(args: string[]): Promise<void>;
|
|
@@ -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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"}
|