@provos/ironcurtain 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -86
- package/dist/cli-help.d.ts +63 -0
- package/dist/cli-help.js +102 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.js +79 -56
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +136 -2
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/constitution-readonly.md +21 -0
- package/dist/config/generated/tool-annotations.json +487 -338
- package/dist/config/generated-readonly/compiled-policy.json +468 -0
- package/dist/config/index.d.ts +21 -1
- package/dist/config/index.js +12 -4
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -8
- package/dist/config/paths.d.ts +47 -0
- package/dist/config/paths.js +81 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/tool-description-hints.json +15 -0
- package/dist/config/types.d.ts +7 -0
- package/dist/config/user-config.d.ts +21 -0
- package/dist/config/user-config.js +8 -0
- package/dist/config/user-config.js.map +1 -1
- package/dist/cron/compile-task-policy.d.ts +17 -0
- package/dist/cron/compile-task-policy.js +39 -0
- package/dist/cron/compile-task-policy.js.map +1 -0
- package/dist/cron/constitution-generator.d.ts +60 -0
- package/dist/cron/constitution-generator.js +217 -0
- package/dist/cron/constitution-generator.js.map +1 -0
- package/dist/cron/cron-scheduler.d.ts +65 -0
- package/dist/cron/cron-scheduler.js +184 -0
- package/dist/cron/cron-scheduler.js.map +1 -0
- package/dist/cron/file-lock.d.ts +41 -0
- package/dist/cron/file-lock.js +156 -0
- package/dist/cron/file-lock.js.map +1 -0
- package/dist/cron/format-utils.d.ts +18 -0
- package/dist/cron/format-utils.js +145 -0
- package/dist/cron/format-utils.js.map +1 -0
- package/dist/cron/git-sync.d.ts +22 -0
- package/dist/cron/git-sync.js +121 -0
- package/dist/cron/git-sync.js.map +1 -0
- package/dist/cron/headless-transport.d.ts +27 -0
- package/dist/cron/headless-transport.js +43 -0
- package/dist/cron/headless-transport.js.map +1 -0
- package/dist/cron/job-commands.d.ts +39 -0
- package/dist/cron/job-commands.js +585 -0
- package/dist/cron/job-commands.js.map +1 -0
- package/dist/cron/job-customizer.d.ts +22 -0
- package/dist/cron/job-customizer.js +47 -0
- package/dist/cron/job-customizer.js.map +1 -0
- package/dist/cron/job-store.d.ts +35 -0
- package/dist/cron/job-store.js +111 -0
- package/dist/cron/job-store.js.map +1 -0
- package/dist/cron/types.d.ts +135 -0
- package/dist/cron/types.js +22 -0
- package/dist/cron/types.js.map +1 -0
- package/dist/daemon/control-socket.d.ts +127 -0
- package/dist/daemon/control-socket.js +261 -0
- package/dist/daemon/control-socket.js.map +1 -0
- package/dist/daemon/daemon-command.d.ts +13 -0
- package/dist/daemon/daemon-command.js +230 -0
- package/dist/daemon/daemon-command.js.map +1 -0
- package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
- package/dist/daemon/ironcurtain-daemon.js +550 -0
- package/dist/daemon/ironcurtain-daemon.js.map +1 -0
- package/dist/docker/adapters/claude-code.js +7 -47
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/goose.d.ts +58 -0
- package/dist/docker/adapters/goose.js +250 -0
- package/dist/docker/adapters/goose.js.map +1 -0
- package/dist/docker/adapters/shared-scripts.d.ts +29 -0
- package/dist/docker/adapters/shared-scripts.js +80 -0
- package/dist/docker/adapters/shared-scripts.js.map +1 -0
- package/dist/docker/agent-adapter.d.ts +12 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.d.ts +6 -1
- package/dist/docker/agent-registry.js +10 -1
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +2 -25
- package/dist/docker/docker-agent-session.js +7 -106
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +8 -0
- package/dist/docker/docker-infrastructure.js +12 -11
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/mitm-proxy.js +10 -5
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/oauth-credentials.js +2 -2
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/pty-session.js +146 -39
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/escalation/escalation-watcher.d.ts +2 -0
- package/dist/escalation/escalation-watcher.js +3 -0
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/escalation/session-registry.js +1 -14
- package/dist/escalation/session-registry.js.map +1 -1
- package/dist/index.js +43 -5
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-app.js +11 -6
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.js +49 -10
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +5 -0
- package/dist/mux/mux-input-handler.js +64 -9
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +20 -0
- package/dist/mux/mux-renderer.js +127 -35
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/mux-splash.js +2 -1
- package/dist/mux/mux-splash.js.map +1 -1
- package/dist/mux/paste-interceptor.d.ts +22 -0
- package/dist/mux/paste-interceptor.js +143 -0
- package/dist/mux/paste-interceptor.js.map +1 -0
- package/dist/mux/pty-bridge.js +1 -1
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/types.d.ts +8 -1
- package/dist/mux/types.js +17 -5
- package/dist/mux/types.js.map +1 -1
- package/dist/persona/compile-persona-policy.d.ts +21 -0
- package/dist/persona/compile-persona-policy.js +50 -0
- package/dist/persona/compile-persona-policy.js.map +1 -0
- package/dist/persona/persona-command.d.ts +9 -0
- package/dist/persona/persona-command.js +479 -0
- package/dist/persona/persona-command.js.map +1 -0
- package/dist/persona/persona-customizer.d.ts +23 -0
- package/dist/persona/persona-customizer.js +52 -0
- package/dist/persona/persona-customizer.js.map +1 -0
- package/dist/persona/persona-prompt.d.ts +19 -0
- package/dist/persona/persona-prompt.js +42 -0
- package/dist/persona/persona-prompt.js.map +1 -0
- package/dist/persona/resolve.d.ts +46 -0
- package/dist/persona/resolve.js +108 -0
- package/dist/persona/resolve.js.map +1 -0
- package/dist/persona/types.d.ts +40 -0
- package/dist/persona/types.js +20 -0
- package/dist/persona/types.js.map +1 -0
- package/dist/pipeline/annotate.js +10 -4
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +14 -31
- package/dist/pipeline/compile.js +50 -563
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +6 -0
- package/dist/pipeline/constitution-compiler.js +42 -6
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/constitution-customizer.d.ts +3 -0
- package/dist/pipeline/constitution-customizer.js +19 -5
- package/dist/pipeline/constitution-customizer.js.map +1 -1
- package/dist/pipeline/customizer-loop.d.ts +34 -0
- package/dist/pipeline/customizer-loop.js +167 -0
- package/dist/pipeline/customizer-loop.js.map +1 -0
- package/dist/pipeline/mcp-connections.d.ts +16 -0
- package/dist/pipeline/mcp-connections.js +61 -0
- package/dist/pipeline/mcp-connections.js.map +1 -0
- package/dist/pipeline/pipeline-runner.d.ts +86 -0
- package/dist/pipeline/pipeline-runner.js +547 -0
- package/dist/pipeline/pipeline-runner.js.map +1 -0
- package/dist/pipeline/pipeline-shared.d.ts +37 -3
- package/dist/pipeline/pipeline-shared.js +77 -16
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +38 -12
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.js +2 -1
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/tool-annotator.d.ts +3 -3
- package/dist/pipeline/tool-annotator.js +114 -4
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/pipeline/types.d.ts +52 -0
- package/dist/sandbox/index.js +36 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/session/agent-session.d.ts +3 -0
- package/dist/session/agent-session.js +10 -1
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.js +134 -12
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.js +26 -6
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +14 -0
- package/dist/session/prompts.js +39 -2
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +105 -0
- package/dist/session/session-manager.js +134 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-metadata.d.ts +18 -0
- package/dist/session/session-metadata.js +34 -0
- package/dist/session/session-metadata.js.map +1 -0
- package/dist/session/types.d.ts +47 -0
- package/dist/session/workspace-validation.d.ts +2 -0
- package/dist/session/workspace-validation.js +6 -5
- package/dist/session/workspace-validation.js.map +1 -1
- package/dist/signal/bot-command.d.ts +2 -0
- package/dist/signal/bot-command.js +8 -0
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/format.d.ts +27 -0
- package/dist/signal/format.js +59 -0
- package/dist/signal/format.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +27 -25
- package/dist/signal/signal-bot-daemon.js +153 -135
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.js +63 -19
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/signal/signal-transport.js +3 -8
- package/dist/signal/signal-transport.js.map +1 -1
- package/dist/trusted-process/domain-utils.d.ts +37 -4
- package/dist/trusted-process/domain-utils.js +130 -11
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/index.js +6 -2
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/mcp-client-manager.js +11 -5
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +21 -0
- package/dist/trusted-process/mcp-proxy-server.js +91 -28
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
- package/dist/trusted-process/permissive-output-validator.js +10 -0
- package/dist/trusted-process/permissive-output-validator.js.map +1 -0
- package/dist/trusted-process/policy-engine.d.ts +29 -7
- package/dist/trusted-process/policy-engine.js +149 -92
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/tool-description-hints.d.ts +19 -0
- package/dist/trusted-process/tool-description-hints.js +53 -0
- package/dist/trusted-process/tool-description-hints.js.map +1 -0
- package/dist/types/argument-roles.d.ts +33 -1
- package/dist/types/argument-roles.js +129 -1
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/slug.d.ts +7 -0
- package/dist/types/slug.js +14 -0
- package/dist/types/slug.js.map +1 -0
- package/dist/utils/editor.d.ts +24 -0
- package/dist/utils/editor.js +66 -0
- package/dist/utils/editor.js.map +1 -0
- package/docker/Dockerfile.goose +34 -0
- package/docker/entrypoint-goose.sh +30 -0
- package/package.json +1 -1
- package/src/config/generated/tool-annotations.json +487 -338
- package/src/config/mcp-servers.json +2 -8
|
@@ -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;
|
|
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;
|
package/dist/session/prompts.js
CHANGED
|
@@ -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('
|
|
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.
|
|
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
|
|
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"}
|
package/dist/session/types.d.ts
CHANGED
|
@@ -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
|
-
//
|
|
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,
|
|
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;
|
|
1
|
+
{"version":3,"file":"bot-command.js","sourceRoot":"","sources":["../../src/signal/bot-command.ts"],"names":[],"mappings":"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"}
|
package/dist/signal/format.d.ts
CHANGED
|
@@ -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;
|