@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.
Files changed (235) hide show
  1. package/README.md +29 -86
  2. package/dist/cli-help.d.ts +63 -0
  3. package/dist/cli-help.js +102 -0
  4. package/dist/cli-help.js.map +1 -0
  5. package/dist/cli.js +79 -56
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/config-command.js +136 -2
  8. package/dist/config/config-command.js.map +1 -1
  9. package/dist/config/constitution-readonly.md +21 -0
  10. package/dist/config/generated/tool-annotations.json +487 -338
  11. package/dist/config/generated-readonly/compiled-policy.json +468 -0
  12. package/dist/config/index.d.ts +21 -1
  13. package/dist/config/index.js +12 -4
  14. package/dist/config/index.js.map +1 -1
  15. package/dist/config/mcp-servers.json +2 -8
  16. package/dist/config/paths.d.ts +47 -0
  17. package/dist/config/paths.js +81 -0
  18. package/dist/config/paths.js.map +1 -1
  19. package/dist/config/tool-description-hints.json +15 -0
  20. package/dist/config/types.d.ts +7 -0
  21. package/dist/config/user-config.d.ts +21 -0
  22. package/dist/config/user-config.js +8 -0
  23. package/dist/config/user-config.js.map +1 -1
  24. package/dist/cron/compile-task-policy.d.ts +17 -0
  25. package/dist/cron/compile-task-policy.js +39 -0
  26. package/dist/cron/compile-task-policy.js.map +1 -0
  27. package/dist/cron/constitution-generator.d.ts +60 -0
  28. package/dist/cron/constitution-generator.js +217 -0
  29. package/dist/cron/constitution-generator.js.map +1 -0
  30. package/dist/cron/cron-scheduler.d.ts +65 -0
  31. package/dist/cron/cron-scheduler.js +184 -0
  32. package/dist/cron/cron-scheduler.js.map +1 -0
  33. package/dist/cron/file-lock.d.ts +41 -0
  34. package/dist/cron/file-lock.js +156 -0
  35. package/dist/cron/file-lock.js.map +1 -0
  36. package/dist/cron/format-utils.d.ts +18 -0
  37. package/dist/cron/format-utils.js +145 -0
  38. package/dist/cron/format-utils.js.map +1 -0
  39. package/dist/cron/git-sync.d.ts +22 -0
  40. package/dist/cron/git-sync.js +121 -0
  41. package/dist/cron/git-sync.js.map +1 -0
  42. package/dist/cron/headless-transport.d.ts +27 -0
  43. package/dist/cron/headless-transport.js +43 -0
  44. package/dist/cron/headless-transport.js.map +1 -0
  45. package/dist/cron/job-commands.d.ts +39 -0
  46. package/dist/cron/job-commands.js +585 -0
  47. package/dist/cron/job-commands.js.map +1 -0
  48. package/dist/cron/job-customizer.d.ts +22 -0
  49. package/dist/cron/job-customizer.js +47 -0
  50. package/dist/cron/job-customizer.js.map +1 -0
  51. package/dist/cron/job-store.d.ts +35 -0
  52. package/dist/cron/job-store.js +111 -0
  53. package/dist/cron/job-store.js.map +1 -0
  54. package/dist/cron/types.d.ts +135 -0
  55. package/dist/cron/types.js +22 -0
  56. package/dist/cron/types.js.map +1 -0
  57. package/dist/daemon/control-socket.d.ts +127 -0
  58. package/dist/daemon/control-socket.js +261 -0
  59. package/dist/daemon/control-socket.js.map +1 -0
  60. package/dist/daemon/daemon-command.d.ts +13 -0
  61. package/dist/daemon/daemon-command.js +230 -0
  62. package/dist/daemon/daemon-command.js.map +1 -0
  63. package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
  64. package/dist/daemon/ironcurtain-daemon.js +550 -0
  65. package/dist/daemon/ironcurtain-daemon.js.map +1 -0
  66. package/dist/docker/adapters/claude-code.js +7 -47
  67. package/dist/docker/adapters/claude-code.js.map +1 -1
  68. package/dist/docker/adapters/goose.d.ts +58 -0
  69. package/dist/docker/adapters/goose.js +250 -0
  70. package/dist/docker/adapters/goose.js.map +1 -0
  71. package/dist/docker/adapters/shared-scripts.d.ts +29 -0
  72. package/dist/docker/adapters/shared-scripts.js +80 -0
  73. package/dist/docker/adapters/shared-scripts.js.map +1 -0
  74. package/dist/docker/agent-adapter.d.ts +12 -0
  75. package/dist/docker/agent-adapter.js.map +1 -1
  76. package/dist/docker/agent-registry.d.ts +6 -1
  77. package/dist/docker/agent-registry.js +10 -1
  78. package/dist/docker/agent-registry.js.map +1 -1
  79. package/dist/docker/docker-agent-session.d.ts +2 -25
  80. package/dist/docker/docker-agent-session.js +7 -106
  81. package/dist/docker/docker-agent-session.js.map +1 -1
  82. package/dist/docker/docker-infrastructure.d.ts +8 -0
  83. package/dist/docker/docker-infrastructure.js +12 -11
  84. package/dist/docker/docker-infrastructure.js.map +1 -1
  85. package/dist/docker/mitm-proxy.js +10 -5
  86. package/dist/docker/mitm-proxy.js.map +1 -1
  87. package/dist/docker/oauth-credentials.js +2 -2
  88. package/dist/docker/oauth-credentials.js.map +1 -1
  89. package/dist/docker/pty-session.js +146 -39
  90. package/dist/docker/pty-session.js.map +1 -1
  91. package/dist/escalation/escalation-watcher.d.ts +2 -0
  92. package/dist/escalation/escalation-watcher.js +3 -0
  93. package/dist/escalation/escalation-watcher.js.map +1 -1
  94. package/dist/escalation/session-registry.js +1 -14
  95. package/dist/escalation/session-registry.js.map +1 -1
  96. package/dist/index.js +43 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/mux/mux-app.js +11 -6
  99. package/dist/mux/mux-app.js.map +1 -1
  100. package/dist/mux/mux-command.js +49 -10
  101. package/dist/mux/mux-command.js.map +1 -1
  102. package/dist/mux/mux-input-handler.d.ts +5 -0
  103. package/dist/mux/mux-input-handler.js +64 -9
  104. package/dist/mux/mux-input-handler.js.map +1 -1
  105. package/dist/mux/mux-renderer.d.ts +20 -0
  106. package/dist/mux/mux-renderer.js +127 -35
  107. package/dist/mux/mux-renderer.js.map +1 -1
  108. package/dist/mux/mux-splash.js +2 -1
  109. package/dist/mux/mux-splash.js.map +1 -1
  110. package/dist/mux/paste-interceptor.d.ts +22 -0
  111. package/dist/mux/paste-interceptor.js +143 -0
  112. package/dist/mux/paste-interceptor.js.map +1 -0
  113. package/dist/mux/pty-bridge.js +1 -1
  114. package/dist/mux/pty-bridge.js.map +1 -1
  115. package/dist/mux/types.d.ts +8 -1
  116. package/dist/mux/types.js +17 -5
  117. package/dist/mux/types.js.map +1 -1
  118. package/dist/persona/compile-persona-policy.d.ts +21 -0
  119. package/dist/persona/compile-persona-policy.js +50 -0
  120. package/dist/persona/compile-persona-policy.js.map +1 -0
  121. package/dist/persona/persona-command.d.ts +9 -0
  122. package/dist/persona/persona-command.js +479 -0
  123. package/dist/persona/persona-command.js.map +1 -0
  124. package/dist/persona/persona-customizer.d.ts +23 -0
  125. package/dist/persona/persona-customizer.js +52 -0
  126. package/dist/persona/persona-customizer.js.map +1 -0
  127. package/dist/persona/persona-prompt.d.ts +19 -0
  128. package/dist/persona/persona-prompt.js +42 -0
  129. package/dist/persona/persona-prompt.js.map +1 -0
  130. package/dist/persona/resolve.d.ts +46 -0
  131. package/dist/persona/resolve.js +108 -0
  132. package/dist/persona/resolve.js.map +1 -0
  133. package/dist/persona/types.d.ts +40 -0
  134. package/dist/persona/types.js +20 -0
  135. package/dist/persona/types.js.map +1 -0
  136. package/dist/pipeline/annotate.js +10 -4
  137. package/dist/pipeline/annotate.js.map +1 -1
  138. package/dist/pipeline/compile.d.ts +14 -31
  139. package/dist/pipeline/compile.js +50 -563
  140. package/dist/pipeline/compile.js.map +1 -1
  141. package/dist/pipeline/constitution-compiler.d.ts +6 -0
  142. package/dist/pipeline/constitution-compiler.js +42 -6
  143. package/dist/pipeline/constitution-compiler.js.map +1 -1
  144. package/dist/pipeline/constitution-customizer.d.ts +3 -0
  145. package/dist/pipeline/constitution-customizer.js +19 -5
  146. package/dist/pipeline/constitution-customizer.js.map +1 -1
  147. package/dist/pipeline/customizer-loop.d.ts +34 -0
  148. package/dist/pipeline/customizer-loop.js +167 -0
  149. package/dist/pipeline/customizer-loop.js.map +1 -0
  150. package/dist/pipeline/mcp-connections.d.ts +16 -0
  151. package/dist/pipeline/mcp-connections.js +61 -0
  152. package/dist/pipeline/mcp-connections.js.map +1 -0
  153. package/dist/pipeline/pipeline-runner.d.ts +86 -0
  154. package/dist/pipeline/pipeline-runner.js +547 -0
  155. package/dist/pipeline/pipeline-runner.js.map +1 -0
  156. package/dist/pipeline/pipeline-shared.d.ts +37 -3
  157. package/dist/pipeline/pipeline-shared.js +77 -16
  158. package/dist/pipeline/pipeline-shared.js.map +1 -1
  159. package/dist/pipeline/refresh-lists.js +38 -12
  160. package/dist/pipeline/refresh-lists.js.map +1 -1
  161. package/dist/pipeline/scenario-generator.js +2 -1
  162. package/dist/pipeline/scenario-generator.js.map +1 -1
  163. package/dist/pipeline/tool-annotator.d.ts +3 -3
  164. package/dist/pipeline/tool-annotator.js +114 -4
  165. package/dist/pipeline/tool-annotator.js.map +1 -1
  166. package/dist/pipeline/types.d.ts +52 -0
  167. package/dist/sandbox/index.js +36 -1
  168. package/dist/sandbox/index.js.map +1 -1
  169. package/dist/session/agent-session.d.ts +3 -0
  170. package/dist/session/agent-session.js +10 -1
  171. package/dist/session/agent-session.js.map +1 -1
  172. package/dist/session/index.d.ts +10 -0
  173. package/dist/session/index.js +134 -12
  174. package/dist/session/index.js.map +1 -1
  175. package/dist/session/preflight.js +26 -6
  176. package/dist/session/preflight.js.map +1 -1
  177. package/dist/session/prompts.d.ts +14 -0
  178. package/dist/session/prompts.js +39 -2
  179. package/dist/session/prompts.js.map +1 -1
  180. package/dist/session/session-manager.d.ts +105 -0
  181. package/dist/session/session-manager.js +134 -0
  182. package/dist/session/session-manager.js.map +1 -0
  183. package/dist/session/session-metadata.d.ts +18 -0
  184. package/dist/session/session-metadata.js +34 -0
  185. package/dist/session/session-metadata.js.map +1 -0
  186. package/dist/session/types.d.ts +47 -0
  187. package/dist/session/workspace-validation.d.ts +2 -0
  188. package/dist/session/workspace-validation.js +6 -5
  189. package/dist/session/workspace-validation.js.map +1 -1
  190. package/dist/signal/bot-command.d.ts +2 -0
  191. package/dist/signal/bot-command.js +8 -0
  192. package/dist/signal/bot-command.js.map +1 -1
  193. package/dist/signal/format.d.ts +27 -0
  194. package/dist/signal/format.js +59 -0
  195. package/dist/signal/format.js.map +1 -1
  196. package/dist/signal/signal-bot-daemon.d.ts +27 -25
  197. package/dist/signal/signal-bot-daemon.js +153 -135
  198. package/dist/signal/signal-bot-daemon.js.map +1 -1
  199. package/dist/signal/signal-container.js +63 -19
  200. package/dist/signal/signal-container.js.map +1 -1
  201. package/dist/signal/signal-transport.js +3 -8
  202. package/dist/signal/signal-transport.js.map +1 -1
  203. package/dist/trusted-process/domain-utils.d.ts +37 -4
  204. package/dist/trusted-process/domain-utils.js +130 -11
  205. package/dist/trusted-process/domain-utils.js.map +1 -1
  206. package/dist/trusted-process/index.js +6 -2
  207. package/dist/trusted-process/index.js.map +1 -1
  208. package/dist/trusted-process/mcp-client-manager.js +11 -5
  209. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  210. package/dist/trusted-process/mcp-proxy-server.d.ts +21 -0
  211. package/dist/trusted-process/mcp-proxy-server.js +91 -28
  212. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  213. package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
  214. package/dist/trusted-process/permissive-output-validator.js +10 -0
  215. package/dist/trusted-process/permissive-output-validator.js.map +1 -0
  216. package/dist/trusted-process/policy-engine.d.ts +29 -7
  217. package/dist/trusted-process/policy-engine.js +149 -92
  218. package/dist/trusted-process/policy-engine.js.map +1 -1
  219. package/dist/trusted-process/tool-description-hints.d.ts +19 -0
  220. package/dist/trusted-process/tool-description-hints.js +53 -0
  221. package/dist/trusted-process/tool-description-hints.js.map +1 -0
  222. package/dist/types/argument-roles.d.ts +33 -1
  223. package/dist/types/argument-roles.js +129 -1
  224. package/dist/types/argument-roles.js.map +1 -1
  225. package/dist/types/slug.d.ts +7 -0
  226. package/dist/types/slug.js +14 -0
  227. package/dist/types/slug.js.map +1 -0
  228. package/dist/utils/editor.d.ts +24 -0
  229. package/dist/utils/editor.js +66 -0
  230. package/dist/utils/editor.js.map +1 -0
  231. package/docker/Dockerfile.goose +34 -0
  232. package/docker/entrypoint-goose.sh +30 -0
  233. package/package.json +1 -1
  234. package/src/config/generated/tool-annotations.json +487 -338
  235. 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 INPUT_LINE_ROWS = 1;
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
- // Clamp overlay to available viewport so it never goes above the tab bar
29
- overlayRows = Math.min(escalationPanelRows + HINT_BAR_ROWS + INPUT_LINE_ROWS, MAX_OVERLAY_ROWS, ptyViewportRows);
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
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mux/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH,mBAAmB;AACnB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,wBAAwB,GAAG,CAAC,CAAC;AACnC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AACrC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,IAAe,EAAE,YAAoB;IACtF,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;IAE5B,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,yEAAyE;QACzE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,aAAa,GAAG,eAAe,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACnH,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;KACR,CAAC;AACJ,CAAC"}
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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"}