@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
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/session/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA0B,MAAM,gCAAgC,CAAC;AAEhH,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAEvC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,oBAAoB,GAAG,aAAwB,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAkBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAsB;IAC1C,YAAY,EAAE,oBAAoB;IAClC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;CAC7B,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,QAAiB,EACjB,MAAyB,EACzB,OAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAyB;IAChE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,oBAAoB,CAAC;IAE5E,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAc,EACd,MAAyB,EACzB,iBAAyC,EACzC,iBAAqC;IAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,MAAM,EAAE,0BAA0B;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,cAAc,CACtB,WAAW,KAAK,4DAA4D,GAAG,kCAAkC,CAClH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,cAAc,CACtB,WAAW,KAAK,4BAA4B,GAAG,8DAA8D,CAC9G,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACnD,MAAM,EAAE,+BAA+B,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG;KACrF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAyB,EACzB,iBAAyC,EACzC,iBAAqC;IAErC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,MAAM,EAAE,sBAAsB;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,oBAAoB,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpF,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,MAAM,EAAE,mCAAmC;SAC5C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACzE,MAAM,EAAE,qBAAqB,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,WAAW;KAC7F,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/session/preflight.ts"],"names":[],"mappings":"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"}
@@ -9,3 +9,17 @@ export interface ServerListing {
9
9
  * to discover tools on demand.
10
10
  */
11
11
  export declare function buildSystemPrompt(serverListings: ServerListing[], allowedDirectory?: string): string;
12
+ /**
13
+ * Context injected into the system prompt for cron-initiated sessions.
14
+ */
15
+ export interface CronPromptContext {
16
+ /** The English task description from the job definition. */
17
+ readonly taskDescription: string;
18
+ /** Absolute path to the persistent workspace directory. */
19
+ readonly workspacePath: string;
20
+ }
21
+ /**
22
+ * Builds the system prompt augmentation for cron sessions.
23
+ * Appended to the standard system prompt (from buildSystemPrompt).
24
+ */
25
+ export declare function buildCronSystemPromptAugmentation(context: CronPromptContext): string;
@@ -63,7 +63,8 @@ ${serverLines}
63
63
  ### Tool discovery
64
64
 
65
65
  Call \`help.help('serverName')\` to list the tools in a server with their required parameters.
66
- Call \`__getToolInterface('namespace.tool_name')\` to inspect a tool's full TypeScript interface.
66
+ Call \`__getToolInterface('tools.server_toolname')\` to inspect a tool's full TypeScript interface.
67
+ Use the exact callable name from the catalog (e.g., \`tools.filesystem_read_text_file\`, \`tools.git_git_push\`).
67
68
 
68
69
  Example workflow:
69
70
  \`\`\`typescript
@@ -71,10 +72,46 @@ Example workflow:
71
72
  const info = help.help('filesystem');
72
73
  return info;
73
74
 
74
- // 2. Then use them
75
+ // 2. Inspect a tool's interface
76
+ const iface = __getToolInterface('tools.filesystem_read_text_file');
77
+ return iface;
78
+
79
+ // 3. Then use them
75
80
  const content = tools.filesystem_read_text_file({ path: '/data/config.json' });
76
81
  return content;
77
82
  \`\`\`
78
83
  `;
79
84
  }
85
+ /**
86
+ * Builds the system prompt augmentation for cron sessions.
87
+ * Appended to the standard system prompt (from buildSystemPrompt).
88
+ */
89
+ export function buildCronSystemPromptAugmentation(context) {
90
+ return `## Scheduled Task Mode
91
+
92
+ You are running as an automated scheduled task. There is no interactive user present.
93
+
94
+ ### Your Task
95
+
96
+ ${context.taskDescription}
97
+
98
+ ### Workspace
99
+
100
+ Your persistent workspace is: ${context.workspacePath}
101
+ This directory persists across runs. Use it for cross-run state:
102
+
103
+ - **workspace/memory.md** -- Your notes for yourself. Read this at the start of each run to recall context from previous runs. Update it with anything you want to remember for next time (last processed item, patterns observed, recurring issues, etc.).
104
+ - **workspace/last-run.md** -- Write a structured summary here before finishing. Include:
105
+ - Date and time of this run
106
+ - Actions taken (with counts: "Labeled 12 issues, commented on 3, closed 1")
107
+ - Any issues encountered or items skipped
108
+ - Recommendations for next run (if any)
109
+
110
+ ### Headless Behavior
111
+
112
+ - If a tool call is denied, do NOT retry it. Note the denial in your summary and continue with other work.
113
+ - If a tool call requires approval and no human responds in time, it will be auto-denied. Continue without that operation.
114
+ - Work efficiently: this is a recurring job, not an exploration. Focus on the task.
115
+ - Always write workspace/last-run.md before finishing, even if the task failed.`;
116
+ }
80
117
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/session/prompts.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAA+B,EAAE,gBAAyB;IAC1F,MAAM,WAAW,GAAG,gBAAgB;QAClC,CAAC,CAAC,gCAAgC,gBAAgB,0EAA0E;QAC5H,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GACf,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,CAAC,CAAC,2BAA2B,CAAC;IAElC,OAAO;;;EAGP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CX,WAAW;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/session/prompts.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAA+B,EAAE,gBAAyB;IAC1F,MAAM,WAAW,GAAG,gBAAgB;QAClC,CAAC,CAAC,gCAAgC,gBAAgB,0EAA0E;QAC5H,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GACf,cAAc,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,CAAC,CAAC,2BAA2B,CAAC;IAElC,OAAO;;;EAGP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CX,WAAW;;;;;;;;;;;;;;;;;;;;;;CAsBZ,CAAC;AACF,CAAC;AAiBD;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,OAA0B;IAC1E,OAAO;;;;;;EAMP,OAAO,CAAC,eAAe;;;;gCAIO,OAAO,CAAC,aAAa;;;;;;;;;;;;;;;gFAe2B,CAAC;AACjF,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * SessionManager -- Unified session state management.
3
+ *
4
+ * Extracted from SignalBotDaemon to serve as the single owner of all
5
+ * managed session state. Both Signal-initiated and cron-initiated
6
+ * sessions register here for unified lifecycle management and
7
+ * escalation routing.
8
+ *
9
+ * This is the canonical location for SessionSource and ManagedSession
10
+ * types. The daemon module re-exports them for convenience.
11
+ */
12
+ import type { Session } from './types.js';
13
+ import type { Transport } from './transport.js';
14
+ import type { JobId } from '../cron/types.js';
15
+ /**
16
+ * Source discriminant for managed sessions.
17
+ * Determines cleanup behavior, notification routing, and
18
+ * message forwarding eligibility.
19
+ *
20
+ * - 'signal': interactive session created via Signal message.
21
+ * Accepts follow-up messages via forwardToSession().
22
+ * - 'cron': headless session created by the cron scheduler.
23
+ * Does NOT accept follow-up messages.
24
+ */
25
+ export type SessionSource = {
26
+ readonly kind: 'signal';
27
+ } | {
28
+ readonly kind: 'cron';
29
+ readonly jobId: JobId;
30
+ readonly jobName: string;
31
+ };
32
+ /**
33
+ * Unified managed session entry. Used for both Signal-initiated
34
+ * interactive sessions and cron-initiated headless sessions.
35
+ *
36
+ * The transport field uses the base Transport interface because
37
+ * cron sessions use HeadlessTransport. Code that needs
38
+ * Signal-specific methods must guard on source.kind === 'signal'.
39
+ */
40
+ export interface ManagedSession {
41
+ readonly label: number;
42
+ readonly session: Session;
43
+ readonly transport: Transport;
44
+ readonly source: SessionSource;
45
+ messageInFlight: boolean;
46
+ pendingEscalationId: string | null;
47
+ escalationResolving: boolean;
48
+ }
49
+ /**
50
+ * Owns all managed session state. Both SignalBotDaemon and
51
+ * CronScheduler delegate to this class for session registration,
52
+ * lookup, and teardown.
53
+ *
54
+ * Invariants:
55
+ * - Labels are monotonically increasing integers starting at 1.
56
+ * - At most one session exists per label.
57
+ * - currentLabel is always either null or a valid label in the map.
58
+ */
59
+ export declare class SessionManager {
60
+ private sessions;
61
+ private nextLabel;
62
+ /**
63
+ * The currently "focused" session label for Signal message routing.
64
+ * When a Signal message arrives without an explicit #N prefix, it
65
+ * is routed to this session.
66
+ *
67
+ * Only updated by register() for Signal sessions. Cron sessions
68
+ * do not steal Signal focus.
69
+ */
70
+ currentLabel: number | null;
71
+ /**
72
+ * Registers a new session and returns its assigned label.
73
+ *
74
+ * For Signal sessions: sets currentLabel to the new session.
75
+ * For cron sessions: currentLabel is NOT changed.
76
+ */
77
+ register(session: Session, transport: Transport, source: SessionSource): number;
78
+ /**
79
+ * Ends a session by label: closes the transport, closes the
80
+ * session, and removes it from the map.
81
+ *
82
+ * If the ended session was currentLabel, switches to the most
83
+ * recently registered remaining Signal session, or null if none.
84
+ */
85
+ end(label: number): Promise<void>;
86
+ /** Returns the ManagedSession for a label, or undefined. */
87
+ get(label: number): ManagedSession | undefined;
88
+ /** Returns all managed sessions (snapshot). */
89
+ all(): readonly ManagedSession[];
90
+ /** Returns managed sessions filtered by source kind. */
91
+ byKind(kind: SessionSource['kind']): readonly ManagedSession[];
92
+ /** Returns the number of active sessions. */
93
+ get size(): number;
94
+ /** Records that a session has a pending escalation. */
95
+ setPendingEscalation(label: number, escalationId: string): void;
96
+ /** Clears a session's pending escalation. */
97
+ clearPendingEscalation(label: number): void;
98
+ /** Returns sessions that have pending escalations. */
99
+ withPendingEscalation(): readonly ManagedSession[];
100
+ /**
101
+ * Finds the most recently registered Signal session label.
102
+ * Returns null if no Signal sessions exist.
103
+ */
104
+ private findMostRecentSignalLabel;
105
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * SessionManager -- Unified session state management.
3
+ *
4
+ * Extracted from SignalBotDaemon to serve as the single owner of all
5
+ * managed session state. Both Signal-initiated and cron-initiated
6
+ * sessions register here for unified lifecycle management and
7
+ * escalation routing.
8
+ *
9
+ * This is the canonical location for SessionSource and ManagedSession
10
+ * types. The daemon module re-exports them for convenience.
11
+ */
12
+ import * as logger from '../logger.js';
13
+ /**
14
+ * Owns all managed session state. Both SignalBotDaemon and
15
+ * CronScheduler delegate to this class for session registration,
16
+ * lookup, and teardown.
17
+ *
18
+ * Invariants:
19
+ * - Labels are monotonically increasing integers starting at 1.
20
+ * - At most one session exists per label.
21
+ * - currentLabel is always either null or a valid label in the map.
22
+ */
23
+ export class SessionManager {
24
+ sessions = new Map();
25
+ nextLabel = 1;
26
+ /**
27
+ * The currently "focused" session label for Signal message routing.
28
+ * When a Signal message arrives without an explicit #N prefix, it
29
+ * is routed to this session.
30
+ *
31
+ * Only updated by register() for Signal sessions. Cron sessions
32
+ * do not steal Signal focus.
33
+ */
34
+ currentLabel = null;
35
+ /**
36
+ * Registers a new session and returns its assigned label.
37
+ *
38
+ * For Signal sessions: sets currentLabel to the new session.
39
+ * For cron sessions: currentLabel is NOT changed.
40
+ */
41
+ register(session, transport, source) {
42
+ const label = this.nextLabel++;
43
+ const managed = {
44
+ label,
45
+ session,
46
+ transport,
47
+ source,
48
+ messageInFlight: false,
49
+ pendingEscalationId: null,
50
+ escalationResolving: false,
51
+ };
52
+ this.sessions.set(label, managed);
53
+ // Only Signal sessions update currentLabel
54
+ if (source.kind === 'signal') {
55
+ this.currentLabel = label;
56
+ }
57
+ return label;
58
+ }
59
+ /**
60
+ * Ends a session by label: closes the transport, closes the
61
+ * session, and removes it from the map.
62
+ *
63
+ * If the ended session was currentLabel, switches to the most
64
+ * recently registered remaining Signal session, or null if none.
65
+ */
66
+ async end(label) {
67
+ const managed = this.sessions.get(label);
68
+ if (!managed)
69
+ return;
70
+ try {
71
+ managed.transport.close();
72
+ }
73
+ catch (err) {
74
+ logger.warn(`[SessionManager] Error closing transport for session #${label}: ${String(err)}`);
75
+ }
76
+ try {
77
+ await managed.session.close();
78
+ }
79
+ catch (err) {
80
+ logger.warn(`[SessionManager] Error closing session #${label}: ${String(err)}`);
81
+ }
82
+ this.sessions.delete(label);
83
+ // If the ended session was the current label, find a replacement
84
+ if (this.currentLabel === label) {
85
+ this.currentLabel = this.findMostRecentSignalLabel();
86
+ }
87
+ }
88
+ /** Returns the ManagedSession for a label, or undefined. */
89
+ get(label) {
90
+ return this.sessions.get(label);
91
+ }
92
+ /** Returns all managed sessions (snapshot). */
93
+ all() {
94
+ return [...this.sessions.values()];
95
+ }
96
+ /** Returns managed sessions filtered by source kind. */
97
+ byKind(kind) {
98
+ return [...this.sessions.values()].filter((m) => m.source.kind === kind);
99
+ }
100
+ /** Returns the number of active sessions. */
101
+ get size() {
102
+ return this.sessions.size;
103
+ }
104
+ /** Records that a session has a pending escalation. */
105
+ setPendingEscalation(label, escalationId) {
106
+ const managed = this.sessions.get(label);
107
+ if (managed) {
108
+ managed.pendingEscalationId = escalationId;
109
+ }
110
+ }
111
+ /** Clears a session's pending escalation. */
112
+ clearPendingEscalation(label) {
113
+ const managed = this.sessions.get(label);
114
+ if (managed) {
115
+ managed.pendingEscalationId = null;
116
+ managed.escalationResolving = false;
117
+ }
118
+ }
119
+ /** Returns sessions that have pending escalations. */
120
+ withPendingEscalation() {
121
+ return [...this.sessions.values()].filter((m) => m.pendingEscalationId !== null);
122
+ }
123
+ /**
124
+ * Finds the most recently registered Signal session label.
125
+ * Returns null if no Signal sessions exist.
126
+ */
127
+ findMostRecentSignalLabel() {
128
+ const signalSessions = this.byKind('signal');
129
+ if (signalSessions.length === 0)
130
+ return null;
131
+ return Math.max(...signalSessions.map((m) => m.label));
132
+ }
133
+ }
134
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Persistence for session metadata (persona, workspace, policyDir).
3
+ *
4
+ * Written once when a session is created; read back on --resume so
5
+ * the session continues with the same settings.
6
+ */
7
+ import type { SessionMetadata } from './types.js';
8
+ /**
9
+ * Writes session metadata to disk. No-ops if the file already exists
10
+ * (idempotent for edge cases like retried session creation).
11
+ */
12
+ export declare function saveSessionMetadata(sessionId: string, metadata: SessionMetadata): void;
13
+ /**
14
+ * Reads session metadata from disk. Returns undefined if the file
15
+ * is missing or contains invalid JSON (graceful for old sessions
16
+ * created before metadata persistence was added).
17
+ */
18
+ export declare function loadSessionMetadata(sessionId: string): SessionMetadata | undefined;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Persistence for session metadata (persona, workspace, policyDir).
3
+ *
4
+ * Written once when a session is created; read back on --resume so
5
+ * the session continues with the same settings.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { getSessionMetadataPath } from '../config/paths.js';
9
+ /**
10
+ * Writes session metadata to disk. No-ops if the file already exists
11
+ * (idempotent for edge cases like retried session creation).
12
+ */
13
+ export function saveSessionMetadata(sessionId, metadata) {
14
+ const path = getSessionMetadataPath(sessionId);
15
+ if (existsSync(path))
16
+ return;
17
+ writeFileSync(path, JSON.stringify(metadata, null, 2) + '\n', 'utf-8');
18
+ }
19
+ /**
20
+ * Reads session metadata from disk. Returns undefined if the file
21
+ * is missing or contains invalid JSON (graceful for old sessions
22
+ * created before metadata persistence was added).
23
+ */
24
+ export function loadSessionMetadata(sessionId) {
25
+ const path = getSessionMetadataPath(sessionId);
26
+ try {
27
+ const raw = readFileSync(path, 'utf-8');
28
+ return JSON.parse(raw);
29
+ }
30
+ catch {
31
+ return undefined;
32
+ }
33
+ }
34
+ //# sourceMappingURL=session-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-metadata.js","sourceRoot":"","sources":["../../src/session/session-metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,QAAyB;IAC9E,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -12,6 +12,19 @@ export type SessionId = string & {
12
12
  };
13
13
  /** Creates a new unique SessionId. */
14
14
  export declare function createSessionId(): SessionId;
15
+ /**
16
+ * Persisted session metadata written to session-metadata.json.
17
+ * Stores the original user intent (persona name, explicit workspace)
18
+ * rather than resolved paths so that on resume the persona can be
19
+ * re-resolved with updated policies.
20
+ */
21
+ export interface SessionMetadata {
22
+ readonly createdAt: string;
23
+ readonly persona?: string;
24
+ readonly workspacePath?: string;
25
+ readonly policyDir?: string;
26
+ readonly disableAutoApprove?: boolean;
27
+ }
15
28
  /**
16
29
  * The possible states a session can be in. Linear progression:
17
30
  * initializing -> ready -> (processing <-> ready) -> closed.
@@ -180,6 +193,12 @@ export interface SessionOptions {
180
193
  * The transport uses this to clear the escalation banner and notify the user.
181
194
  */
182
195
  onEscalationExpired?: () => void;
196
+ /**
197
+ * Callback invoked when a pending escalation is resolved (approved or denied).
198
+ * Fires after the response file is written, regardless of whether the resolution
199
+ * was initiated by the transport or by the proxy (e.g., Signal approve command).
200
+ */
201
+ onEscalationResolved?: (escalationId: string, decision: 'approved' | 'denied') => void;
183
202
  /**
184
203
  * Callback invoked during message processing with diagnostic events.
185
204
  * Transports use this to display progress (e.g., tool call previews).
@@ -192,6 +211,34 @@ export interface SessionOptions {
192
211
  * Must be validated via validateWorkspacePath() before passing here.
193
212
  */
194
213
  workspacePath?: string;
214
+ /**
215
+ * When set, loads compiled-policy.json (and optionally
216
+ * dynamic-lists.json) from this directory instead of the global
217
+ * generated directory. Tool annotations are always loaded from
218
+ * the global location regardless of this setting.
219
+ *
220
+ * Used by cron sessions to load task-scoped policy.
221
+ */
222
+ policyDir?: string;
223
+ /**
224
+ * Additional content appended to the system prompt.
225
+ * Used by cron sessions to inject task context and workspace
226
+ * conventions.
227
+ */
228
+ systemPromptAugmentation?: string;
229
+ /**
230
+ * When true, disables the auto-approver for this session even if
231
+ * enabled in user config. Used by cron/headless sessions where there
232
+ * is no interactive user context to match escalations against.
233
+ */
234
+ disableAutoApprove?: boolean;
235
+ /**
236
+ * Persona name. When set, resolves to a policyDir, optional server
237
+ * filter, persistent workspace, and system prompt augmentation.
238
+ * Mutually exclusive with policyDir -- if both are provided,
239
+ * persona takes precedence with a warning.
240
+ */
241
+ persona?: string;
195
242
  }
196
243
  /**
197
244
  * The core session contract. A session is a stateful conversation
@@ -6,6 +6,8 @@
6
6
  * as the allowedDirectory, so it must not overlap with protected paths
7
7
  * or sensitive system directories.
8
8
  */
9
+ /** Returns true when `child` is equal to or nested inside `parent`. */
10
+ export declare function isEqualOrInside(child: string, parent: string): boolean;
9
11
  /**
10
12
  * Validates and canonicalizes a workspace path.
11
13
  *
@@ -12,7 +12,7 @@ import { resolve } from 'node:path';
12
12
  import { expandTilde, resolveRealPath } from '../types/argument-roles.js';
13
13
  import { getIronCurtainHome } from '../config/paths.js';
14
14
  /** Returns true when `child` is equal to or nested inside `parent`. */
15
- function isEqualOrInside(child, parent) {
15
+ export function isEqualOrInside(child, parent) {
16
16
  if (child === parent)
17
17
  return true;
18
18
  const prefix = parent === '/' ? '/' : parent + '/';
@@ -50,15 +50,16 @@ export function validateWorkspacePath(rawPath, protectedPaths) {
50
50
  if (isEqualOrInside(canonical, ironCurtainHome)) {
51
51
  throw new Error(`Workspace path is inside the IronCurtain home directory: ${canonical}`);
52
52
  }
53
- // Bidirectional overlap check with protected paths
53
+ // Check that workspace is not inside a protected path.
54
+ // The reverse direction (protected path inside workspace) is intentionally
55
+ // NOT checked here — the PolicyEngine already protects those paths at
56
+ // runtime regardless of the allowedDirectory, so a workspace that happens
57
+ // to contain e.g. src/config/generated/ is perfectly safe.
54
58
  for (const pp of protectedPaths) {
55
59
  const protectedCanonical = resolveRealPath(pp);
56
60
  if (isEqualOrInside(canonical, protectedCanonical)) {
57
61
  throw new Error(`Workspace path overlaps with protected path: ${protectedCanonical}`);
58
62
  }
59
- if (isEqualOrInside(protectedCanonical, canonical)) {
60
- throw new Error(`Workspace would contain protected path ${protectedCanonical} — ` + `use a more specific subdirectory`);
61
- }
62
63
  }
63
64
  return canonical;
64
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-validation.js","sourceRoot":"","sources":["../../src/session/workspace-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,uEAAuE;AACvE,SAAS,eAAe,CAAC,KAAa,EAAE,MAAc;IACpD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IACnD,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,cAAwB;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE5C,gCAAgC;IAChC,IAAI,IAAiC,CAAC;IACtC,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9D,IAAI,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,4DAA4D,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,eAAe,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gDAAgD,kBAAkB,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,0CAA0C,kBAAkB,KAAK,GAAG,kCAAkC,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"workspace-validation.js","sourceRoot":"","sources":["../../src/session/workspace-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,MAAc;IAC3D,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IACnD,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,cAAwB;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE5C,gCAAgC;IAChC,IAAI,IAAiC,CAAC;IACtC,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9D,IAAI,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,4DAA4D,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,uDAAuD;IACvD,2EAA2E;IAC3E,sEAAsE;IACtE,0EAA0E;IAC1E,2DAA2D;IAC3D,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,eAAe,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gDAAgD,kBAAkB,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -6,6 +6,8 @@
6
6
  * indefinitely. Sessions are created on demand when the user sends a
7
7
  * Signal message and destroyed when they end.
8
8
  */
9
+ import type { CommandSpec } from '../cli-help.js';
10
+ export declare const botSpec: CommandSpec;
9
11
  export interface BotOptions {
10
12
  /** Explicit agent selection (e.g., 'claude-code'). */
11
13
  agent?: string;
@@ -15,6 +15,14 @@ import { SignalBotDaemon } from './signal-bot-daemon.js';
15
15
  import { createSignalContainerManager } from './signal-container.js';
16
16
  import { resolveSignalConfig } from './signal-config.js';
17
17
  import * as logger from '../logger.js';
18
+ export const botSpec = {
19
+ name: 'ironcurtain bot',
20
+ description: 'Run the Signal transport (standalone, without cron scheduler)',
21
+ usage: ['ironcurtain bot [options]'],
22
+ options: [
23
+ { flag: 'agent', short: 'a', description: 'Agent mode: builtin or claude-code (Docker)', placeholder: '<name>' },
24
+ ],
25
+ };
18
26
  export async function runBot(options = {}) {
19
27
  const userConfig = loadUserConfig();
20
28
  const signalConfig = resolveSignalConfig(userConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"bot-command.js","sourceRoot":"","sources":["../../src/signal/bot-command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAQvC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAsB,EAAE;IACnD,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sDAAsD;IACtD,6DAA6D;IAC7D,yDAAyD;IACzD,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,2DAA2D;IAC3D,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC;QACzC,MAAM;QACN,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,OAAO,CAAC,KAAiB,CAAC,CAAC,CAAC,SAAS;KACvE,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAE5B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,YAAY;QACpB,gBAAgB;QAChB,IAAI;KACL,CAAC,CAAC;IAEH,gDAAgD;IAChD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,YAAY;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;QAC/D,YAAY,GAAG,IAAI,CAAC;QACpB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAE7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEhD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"bot-command.js","sourceRoot":"","sources":["../../src/signal/bot-command.ts"],"names":[],"mappings":"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"}
@@ -49,3 +49,30 @@ export declare function formatSessionList(sessions: SessionListEntry[], currentL
49
49
  * Prefixes a message with `[#N]` when multiple sessions are active.
50
50
  */
51
51
  export declare function prefixWithLabel(text: string, label: number, sessionCount: number): string;
52
+ /**
53
+ * Information about a scheduled job for display in Signal.
54
+ * Dates are ISO strings (serialized by the control socket).
55
+ */
56
+ export interface JobListEntry {
57
+ readonly job: {
58
+ readonly id: string;
59
+ readonly name: string;
60
+ readonly schedule: string;
61
+ readonly enabled: boolean;
62
+ };
63
+ readonly nextRun: string | null;
64
+ readonly lastRun: {
65
+ readonly outcome: {
66
+ readonly kind: string;
67
+ readonly message?: string;
68
+ readonly dimension?: string;
69
+ };
70
+ readonly startedAt: string;
71
+ } | undefined;
72
+ readonly isRunning: boolean;
73
+ }
74
+ /**
75
+ * Formats the /jobs command output.
76
+ * Shows each job with schedule, status, next run, and last run outcome.
77
+ */
78
+ export declare function formatJobList(jobs: JobListEntry[]): string;