@provos/ironcurtain 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +85 -66
  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 +78 -52
  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/generated/tool-annotations.json +487 -338
  10. package/dist/config/index.d.ts +21 -1
  11. package/dist/config/index.js +12 -4
  12. package/dist/config/index.js.map +1 -1
  13. package/dist/config/mcp-servers.json +2 -8
  14. package/dist/config/paths.d.ts +30 -0
  15. package/dist/config/paths.js +58 -0
  16. package/dist/config/paths.js.map +1 -1
  17. package/dist/config/tool-description-hints.json +15 -0
  18. package/dist/config/types.d.ts +13 -0
  19. package/dist/config/user-config.d.ts +21 -0
  20. package/dist/config/user-config.js +8 -0
  21. package/dist/config/user-config.js.map +1 -1
  22. package/dist/cron/compile-task-policy.d.ts +17 -0
  23. package/dist/cron/compile-task-policy.js +39 -0
  24. package/dist/cron/compile-task-policy.js.map +1 -0
  25. package/dist/cron/cron-scheduler.d.ts +65 -0
  26. package/dist/cron/cron-scheduler.js +184 -0
  27. package/dist/cron/cron-scheduler.js.map +1 -0
  28. package/dist/cron/file-lock.d.ts +41 -0
  29. package/dist/cron/file-lock.js +156 -0
  30. package/dist/cron/file-lock.js.map +1 -0
  31. package/dist/cron/format-utils.d.ts +18 -0
  32. package/dist/cron/format-utils.js +145 -0
  33. package/dist/cron/format-utils.js.map +1 -0
  34. package/dist/cron/git-sync.d.ts +22 -0
  35. package/dist/cron/git-sync.js +121 -0
  36. package/dist/cron/git-sync.js.map +1 -0
  37. package/dist/cron/headless-transport.d.ts +27 -0
  38. package/dist/cron/headless-transport.js +43 -0
  39. package/dist/cron/headless-transport.js.map +1 -0
  40. package/dist/cron/job-commands.d.ts +39 -0
  41. package/dist/cron/job-commands.js +522 -0
  42. package/dist/cron/job-commands.js.map +1 -0
  43. package/dist/cron/job-store.d.ts +35 -0
  44. package/dist/cron/job-store.js +111 -0
  45. package/dist/cron/job-store.js.map +1 -0
  46. package/dist/cron/types.d.ts +127 -0
  47. package/dist/cron/types.js +25 -0
  48. package/dist/cron/types.js.map +1 -0
  49. package/dist/daemon/control-socket.d.ts +127 -0
  50. package/dist/daemon/control-socket.js +261 -0
  51. package/dist/daemon/control-socket.js.map +1 -0
  52. package/dist/daemon/daemon-command.d.ts +13 -0
  53. package/dist/daemon/daemon-command.js +230 -0
  54. package/dist/daemon/daemon-command.js.map +1 -0
  55. package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
  56. package/dist/daemon/ironcurtain-daemon.js +548 -0
  57. package/dist/daemon/ironcurtain-daemon.js.map +1 -0
  58. package/dist/docker/adapters/claude-code.js +8 -48
  59. package/dist/docker/adapters/claude-code.js.map +1 -1
  60. package/dist/docker/adapters/goose.d.ts +58 -0
  61. package/dist/docker/adapters/goose.js +250 -0
  62. package/dist/docker/adapters/goose.js.map +1 -0
  63. package/dist/docker/adapters/shared-scripts.d.ts +29 -0
  64. package/dist/docker/adapters/shared-scripts.js +80 -0
  65. package/dist/docker/adapters/shared-scripts.js.map +1 -0
  66. package/dist/docker/agent-adapter.d.ts +12 -0
  67. package/dist/docker/agent-adapter.js.map +1 -1
  68. package/dist/docker/agent-registry.d.ts +6 -1
  69. package/dist/docker/agent-registry.js +10 -1
  70. package/dist/docker/agent-registry.js.map +1 -1
  71. package/dist/docker/docker-agent-session.d.ts +2 -25
  72. package/dist/docker/docker-agent-session.js +7 -106
  73. package/dist/docker/docker-agent-session.js.map +1 -1
  74. package/dist/docker/docker-infrastructure.d.ts +8 -0
  75. package/dist/docker/docker-infrastructure.js +22 -14
  76. package/dist/docker/docker-infrastructure.js.map +1 -1
  77. package/dist/docker/mitm-proxy.d.ts +5 -2
  78. package/dist/docker/mitm-proxy.js +169 -46
  79. package/dist/docker/mitm-proxy.js.map +1 -1
  80. package/dist/docker/oauth-credentials.d.ts +15 -2
  81. package/dist/docker/oauth-credentials.js +92 -8
  82. package/dist/docker/oauth-credentials.js.map +1 -1
  83. package/dist/docker/oauth-token-manager.d.ts +80 -0
  84. package/dist/docker/oauth-token-manager.js +133 -0
  85. package/dist/docker/oauth-token-manager.js.map +1 -0
  86. package/dist/docker/pty-session.d.ts +2 -0
  87. package/dist/docker/pty-session.js +17 -8
  88. package/dist/docker/pty-session.js.map +1 -1
  89. package/dist/escalation/escalation-watcher.d.ts +2 -0
  90. package/dist/escalation/escalation-watcher.js +5 -0
  91. package/dist/escalation/escalation-watcher.js.map +1 -1
  92. package/dist/escalation/listener-command.js +9 -58
  93. package/dist/escalation/listener-command.js.map +1 -1
  94. package/dist/escalation/listener-lock.d.ts +20 -0
  95. package/dist/escalation/listener-lock.js +69 -0
  96. package/dist/escalation/listener-lock.js.map +1 -0
  97. package/dist/escalation/session-registry.js +1 -14
  98. package/dist/escalation/session-registry.js.map +1 -1
  99. package/dist/index.js +51 -2
  100. package/dist/index.js.map +1 -1
  101. package/dist/mux/mux-app.d.ts +24 -0
  102. package/dist/mux/mux-app.js +450 -0
  103. package/dist/mux/mux-app.js.map +1 -0
  104. package/dist/mux/mux-command.d.ts +7 -0
  105. package/dist/mux/mux-command.js +104 -0
  106. package/dist/mux/mux-command.js.map +1 -0
  107. package/dist/mux/mux-escalation-manager.d.ts +48 -0
  108. package/dist/mux/mux-escalation-manager.js +162 -0
  109. package/dist/mux/mux-escalation-manager.js.map +1 -0
  110. package/dist/mux/mux-input-handler.d.ts +54 -0
  111. package/dist/mux/mux-input-handler.js +512 -0
  112. package/dist/mux/mux-input-handler.js.map +1 -0
  113. package/dist/mux/mux-renderer.d.ts +106 -0
  114. package/dist/mux/mux-renderer.js +850 -0
  115. package/dist/mux/mux-renderer.js.map +1 -0
  116. package/dist/mux/mux-splash.d.ts +17 -0
  117. package/dist/mux/mux-splash.js +323 -0
  118. package/dist/mux/mux-splash.js.map +1 -0
  119. package/dist/mux/paste-interceptor.d.ts +22 -0
  120. package/dist/mux/paste-interceptor.js +143 -0
  121. package/dist/mux/paste-interceptor.js.map +1 -0
  122. package/dist/mux/pty-bridge.d.ts +79 -0
  123. package/dist/mux/pty-bridge.js +151 -0
  124. package/dist/mux/pty-bridge.js.map +1 -0
  125. package/dist/mux/trusted-input.d.ts +27 -0
  126. package/dist/mux/trusted-input.js +27 -0
  127. package/dist/mux/trusted-input.js.map +1 -0
  128. package/dist/mux/types.d.ts +99 -0
  129. package/dist/mux/types.js +57 -0
  130. package/dist/mux/types.js.map +1 -0
  131. package/dist/pipeline/annotate.js +2 -1
  132. package/dist/pipeline/annotate.js.map +1 -1
  133. package/dist/pipeline/compile.d.ts +4 -34
  134. package/dist/pipeline/compile.js +29 -568
  135. package/dist/pipeline/compile.js.map +1 -1
  136. package/dist/pipeline/constitution-compiler.js +1 -1
  137. package/dist/pipeline/mcp-connections.d.ts +16 -0
  138. package/dist/pipeline/mcp-connections.js +61 -0
  139. package/dist/pipeline/mcp-connections.js.map +1 -0
  140. package/dist/pipeline/pipeline-runner.d.ts +86 -0
  141. package/dist/pipeline/pipeline-runner.js +554 -0
  142. package/dist/pipeline/pipeline-runner.js.map +1 -0
  143. package/dist/pipeline/pipeline-shared.d.ts +29 -2
  144. package/dist/pipeline/pipeline-shared.js +68 -12
  145. package/dist/pipeline/pipeline-shared.js.map +1 -1
  146. package/dist/pipeline/refresh-lists.js +38 -12
  147. package/dist/pipeline/refresh-lists.js.map +1 -1
  148. package/dist/pipeline/scenario-generator.js +2 -1
  149. package/dist/pipeline/scenario-generator.js.map +1 -1
  150. package/dist/pipeline/tool-annotator.d.ts +3 -3
  151. package/dist/pipeline/tool-annotator.js +96 -4
  152. package/dist/pipeline/tool-annotator.js.map +1 -1
  153. package/dist/pipeline/types.d.ts +52 -0
  154. package/dist/sandbox/index.js +40 -1
  155. package/dist/sandbox/index.js.map +1 -1
  156. package/dist/session/agent-session.d.ts +3 -0
  157. package/dist/session/agent-session.js +13 -1
  158. package/dist/session/agent-session.js.map +1 -1
  159. package/dist/session/index.js +65 -9
  160. package/dist/session/index.js.map +1 -1
  161. package/dist/session/preflight.js +26 -6
  162. package/dist/session/preflight.js.map +1 -1
  163. package/dist/session/prompts.d.ts +14 -0
  164. package/dist/session/prompts.js +39 -2
  165. package/dist/session/prompts.js.map +1 -1
  166. package/dist/session/session-manager.d.ts +105 -0
  167. package/dist/session/session-manager.js +134 -0
  168. package/dist/session/session-manager.js.map +1 -0
  169. package/dist/session/types.d.ts +33 -0
  170. package/dist/session/workspace-validation.d.ts +19 -0
  171. package/dist/session/workspace-validation.js +66 -0
  172. package/dist/session/workspace-validation.js.map +1 -0
  173. package/dist/signal/bot-command.d.ts +2 -0
  174. package/dist/signal/bot-command.js +8 -0
  175. package/dist/signal/bot-command.js.map +1 -1
  176. package/dist/signal/format.d.ts +27 -0
  177. package/dist/signal/format.js +59 -0
  178. package/dist/signal/format.js.map +1 -1
  179. package/dist/signal/signal-bot-daemon.d.ts +27 -25
  180. package/dist/signal/signal-bot-daemon.js +145 -130
  181. package/dist/signal/signal-bot-daemon.js.map +1 -1
  182. package/dist/signal/signal-container.js +63 -19
  183. package/dist/signal/signal-container.js.map +1 -1
  184. package/dist/signal/signal-transport.js +3 -8
  185. package/dist/signal/signal-transport.js.map +1 -1
  186. package/dist/trusted-process/auto-approver.d.ts +13 -4
  187. package/dist/trusted-process/auto-approver.js +12 -5
  188. package/dist/trusted-process/auto-approver.js.map +1 -1
  189. package/dist/trusted-process/domain-utils.d.ts +38 -4
  190. package/dist/trusted-process/domain-utils.js +118 -11
  191. package/dist/trusted-process/domain-utils.js.map +1 -1
  192. package/dist/trusted-process/escalation.js +5 -0
  193. package/dist/trusted-process/escalation.js.map +1 -1
  194. package/dist/trusted-process/index.js +6 -2
  195. package/dist/trusted-process/index.js.map +1 -1
  196. package/dist/trusted-process/mcp-client-manager.js +11 -5
  197. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  198. package/dist/trusted-process/mcp-proxy-server.d.ts +2 -0
  199. package/dist/trusted-process/mcp-proxy-server.js +98 -32
  200. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  201. package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
  202. package/dist/trusted-process/permissive-output-validator.js +10 -0
  203. package/dist/trusted-process/permissive-output-validator.js.map +1 -0
  204. package/dist/trusted-process/policy-engine.d.ts +27 -4
  205. package/dist/trusted-process/policy-engine.js +152 -57
  206. package/dist/trusted-process/policy-engine.js.map +1 -1
  207. package/dist/trusted-process/tool-description-hints.d.ts +19 -0
  208. package/dist/trusted-process/tool-description-hints.js +53 -0
  209. package/dist/trusted-process/tool-description-hints.js.map +1 -0
  210. package/dist/types/argument-roles.d.ts +33 -1
  211. package/dist/types/argument-roles.js +129 -1
  212. package/dist/types/argument-roles.js.map +1 -1
  213. package/docker/Dockerfile.goose +34 -0
  214. package/docker/entrypoint-goose.sh +30 -0
  215. package/package.json +6 -1
  216. package/src/config/generated/tool-annotations.json +487 -338
  217. package/src/config/mcp-servers.json +2 -8
@@ -9,10 +9,15 @@
9
9
  * - Identity verification with TTL cache (5 min), fail-closed
10
10
  * - Escalation state with race prevention (per-session)
11
11
  * - Message sending via POST /v2/send with text_mode: "styled"
12
+ *
13
+ * Session state is owned by SessionManager (injected via constructor).
14
+ * This class only handles Signal-specific concerns: WebSocket, identity,
15
+ * message parsing, and command dispatch.
12
16
  */
13
17
  import { type ResolvedSignalConfig } from './signal-config.js';
14
18
  import type { SessionMode } from '../session/types.js';
15
19
  import type { SignalContainerManager } from './signal-container.js';
20
+ import { SessionManager } from '../session/session-manager.js';
16
21
  /**
17
22
  * Signal message envelope received via WebSocket.
18
23
  * Only the fields relevant to IronCurtain are typed here;
@@ -46,20 +51,19 @@ export interface SignalBotDaemonOptions {
46
51
  readonly config: ResolvedSignalConfig;
47
52
  readonly containerManager: SignalContainerManager;
48
53
  readonly mode: SessionMode;
54
+ readonly sessionManager?: SessionManager;
49
55
  }
50
56
  export declare class SignalBotDaemon {
51
57
  private config;
52
58
  private readonly containerManager;
53
59
  private readonly mode;
60
+ private readonly sessionManager;
54
61
  private ws;
55
62
  private baseUrl;
56
63
  private closed;
57
64
  private reconnectAttempts;
58
65
  private static readonly MAX_RECONNECT_DELAY_MS;
59
66
  private static readonly BASE_RECONNECT_DELAY_MS;
60
- private sessions;
61
- private currentLabel;
62
- private nextLabel;
63
67
  private readonly maxConcurrentSessions;
64
68
  private identityLocked;
65
69
  private lastIdentityCheckMs;
@@ -74,12 +78,23 @@ export declare class SignalBotDaemon {
74
78
  */
75
79
  private scheduleSessionOp;
76
80
  /**
77
- * Starts the daemon. Returns a promise that resolves when
78
- * shutdown() is called (e.g., SIGTERM/SIGINT).
81
+ * Connects the daemon: starts the Docker container, waits for
82
+ * health, connects WebSocket, and sends the online greeting.
83
+ * Throws if any step fails (container won't start, health timeout, etc.).
84
+ */
85
+ connect(): Promise<void>;
86
+ /**
87
+ * Blocks until shutdown() is called (e.g., SIGTERM/SIGINT).
88
+ * Call connect() first to establish the connection.
89
+ */
90
+ run(): Promise<void>;
91
+ /**
92
+ * Convenience: connects and then blocks until shutdown.
93
+ * Used by the standalone `ironcurtain bot` command.
79
94
  */
80
95
  start(): Promise<void>;
81
96
  /**
82
- * Initiates graceful shutdown. Ends all active sessions,
97
+ * Initiates graceful shutdown. Ends all Signal sessions,
83
98
  * closes the WebSocket, and unblocks start().
84
99
  */
85
100
  shutdown(): Promise<void>;
@@ -93,12 +108,13 @@ export declare class SignalBotDaemon {
93
108
  private scheduleReconnect;
94
109
  private handleIncomingMessage;
95
110
  /**
96
- * Routes a user message to the current session. Creates a new
111
+ * Routes a user message to the current Signal session. Creates a new
97
112
  * session if none exists. Handles BudgetExhaustedError by ending
98
113
  * the exhausted session and notifying the user.
99
114
  *
100
115
  * Supports one-shot `#N` prefix routing: `#2 do something` routes
101
116
  * "do something" to session #2 without changing currentLabel.
117
+ * Only Signal sessions accept forwarded messages.
102
118
  */
103
119
  private routeToSession;
104
120
  /**
@@ -107,34 +123,20 @@ export declare class SignalBotDaemon {
107
123
  */
108
124
  private forwardToSession;
109
125
  /**
110
- * Creates a new session with a fresh SignalSessionTransport.
126
+ * Creates a new Signal session with a fresh SignalSessionTransport.
111
127
  * Follows the same pattern as index.ts: create transport,
112
128
  * wire callbacks, create session, start transport.
113
129
  * Returns the label of the new session.
114
130
  */
115
131
  private startNewSession;
116
- /**
117
- * Ends a specific session by label and cleans up.
118
- * If it was the current session, auto-switches to the most recent remaining.
119
- */
120
- endSession(label: number): Promise<void>;
121
- /**
122
- * Convenience method: ends the current session (if any).
123
- */
124
- endCurrentSession(): Promise<void>;
125
- /**
126
- * Auto-switches currentLabel to the highest remaining label (most recent),
127
- * or null if no sessions remain.
128
- */
129
- private autoSwitchCurrent;
130
132
  /**
131
133
  * Checks if the message is an escalation reply.
132
134
  * Accepts: approve, deny, /approve, /deny (case-insensitive).
133
135
  * Optionally with a session label: "approve #2", "/approve 2".
134
136
  *
135
- * Routes to the session with a pending escalation. If multiple
136
- * sessions have pending escalations and no label is specified,
137
- * asks for disambiguation.
137
+ * Routes to the session with a pending escalation.
138
+ * Works across ALL session types (signal + cron) so that
139
+ * `approve #3` from Signal can approve a cron job's escalation.
138
140
  */
139
141
  private handleEscalationReply;
140
142
  /** Called by SignalSessionTransport when the session surfaces an escalation. */