@provos/ironcurtain 0.6.0 → 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 (187) hide show
  1. package/README.md +21 -2
  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 +73 -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/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 +7 -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 +7 -47
  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 +12 -11
  76. package/dist/docker/docker-infrastructure.js.map +1 -1
  77. package/dist/docker/pty-session.js +7 -4
  78. package/dist/docker/pty-session.js.map +1 -1
  79. package/dist/escalation/escalation-watcher.d.ts +2 -0
  80. package/dist/escalation/escalation-watcher.js +3 -0
  81. package/dist/escalation/escalation-watcher.js.map +1 -1
  82. package/dist/escalation/session-registry.js +1 -14
  83. package/dist/escalation/session-registry.js.map +1 -1
  84. package/dist/index.js +30 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/mux/mux-app.js +11 -6
  87. package/dist/mux/mux-app.js.map +1 -1
  88. package/dist/mux/mux-command.js +20 -9
  89. package/dist/mux/mux-command.js.map +1 -1
  90. package/dist/mux/mux-input-handler.d.ts +5 -0
  91. package/dist/mux/mux-input-handler.js +64 -9
  92. package/dist/mux/mux-input-handler.js.map +1 -1
  93. package/dist/mux/mux-renderer.d.ts +20 -0
  94. package/dist/mux/mux-renderer.js +127 -35
  95. package/dist/mux/mux-renderer.js.map +1 -1
  96. package/dist/mux/mux-splash.js +2 -1
  97. package/dist/mux/mux-splash.js.map +1 -1
  98. package/dist/mux/paste-interceptor.d.ts +22 -0
  99. package/dist/mux/paste-interceptor.js +143 -0
  100. package/dist/mux/paste-interceptor.js.map +1 -0
  101. package/dist/mux/pty-bridge.js +1 -1
  102. package/dist/mux/pty-bridge.js.map +1 -1
  103. package/dist/mux/types.d.ts +8 -1
  104. package/dist/mux/types.js +17 -5
  105. package/dist/mux/types.js.map +1 -1
  106. package/dist/pipeline/annotate.js +2 -1
  107. package/dist/pipeline/annotate.js.map +1 -1
  108. package/dist/pipeline/compile.d.ts +4 -34
  109. package/dist/pipeline/compile.js +29 -568
  110. package/dist/pipeline/compile.js.map +1 -1
  111. package/dist/pipeline/constitution-compiler.js +1 -1
  112. package/dist/pipeline/mcp-connections.d.ts +16 -0
  113. package/dist/pipeline/mcp-connections.js +61 -0
  114. package/dist/pipeline/mcp-connections.js.map +1 -0
  115. package/dist/pipeline/pipeline-runner.d.ts +86 -0
  116. package/dist/pipeline/pipeline-runner.js +554 -0
  117. package/dist/pipeline/pipeline-runner.js.map +1 -0
  118. package/dist/pipeline/pipeline-shared.d.ts +29 -2
  119. package/dist/pipeline/pipeline-shared.js +68 -12
  120. package/dist/pipeline/pipeline-shared.js.map +1 -1
  121. package/dist/pipeline/refresh-lists.js +38 -12
  122. package/dist/pipeline/refresh-lists.js.map +1 -1
  123. package/dist/pipeline/scenario-generator.js +2 -1
  124. package/dist/pipeline/scenario-generator.js.map +1 -1
  125. package/dist/pipeline/tool-annotator.d.ts +3 -3
  126. package/dist/pipeline/tool-annotator.js +96 -4
  127. package/dist/pipeline/tool-annotator.js.map +1 -1
  128. package/dist/pipeline/types.d.ts +52 -0
  129. package/dist/sandbox/index.js +36 -1
  130. package/dist/sandbox/index.js.map +1 -1
  131. package/dist/session/agent-session.d.ts +3 -0
  132. package/dist/session/agent-session.js +10 -1
  133. package/dist/session/agent-session.js.map +1 -1
  134. package/dist/session/index.js +54 -5
  135. package/dist/session/index.js.map +1 -1
  136. package/dist/session/preflight.js +26 -6
  137. package/dist/session/preflight.js.map +1 -1
  138. package/dist/session/prompts.d.ts +14 -0
  139. package/dist/session/prompts.js +39 -2
  140. package/dist/session/prompts.js.map +1 -1
  141. package/dist/session/session-manager.d.ts +105 -0
  142. package/dist/session/session-manager.js +134 -0
  143. package/dist/session/session-manager.js.map +1 -0
  144. package/dist/session/types.d.ts +27 -0
  145. package/dist/session/workspace-validation.d.ts +2 -0
  146. package/dist/session/workspace-validation.js +6 -5
  147. package/dist/session/workspace-validation.js.map +1 -1
  148. package/dist/signal/bot-command.d.ts +2 -0
  149. package/dist/signal/bot-command.js +8 -0
  150. package/dist/signal/bot-command.js.map +1 -1
  151. package/dist/signal/format.d.ts +27 -0
  152. package/dist/signal/format.js +59 -0
  153. package/dist/signal/format.js.map +1 -1
  154. package/dist/signal/signal-bot-daemon.d.ts +27 -25
  155. package/dist/signal/signal-bot-daemon.js +145 -130
  156. package/dist/signal/signal-bot-daemon.js.map +1 -1
  157. package/dist/signal/signal-container.js +63 -19
  158. package/dist/signal/signal-container.js.map +1 -1
  159. package/dist/signal/signal-transport.js +3 -8
  160. package/dist/signal/signal-transport.js.map +1 -1
  161. package/dist/trusted-process/domain-utils.d.ts +38 -4
  162. package/dist/trusted-process/domain-utils.js +118 -11
  163. package/dist/trusted-process/domain-utils.js.map +1 -1
  164. package/dist/trusted-process/index.js +6 -2
  165. package/dist/trusted-process/index.js.map +1 -1
  166. package/dist/trusted-process/mcp-client-manager.js +11 -5
  167. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  168. package/dist/trusted-process/mcp-proxy-server.d.ts +2 -0
  169. package/dist/trusted-process/mcp-proxy-server.js +59 -16
  170. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  171. package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
  172. package/dist/trusted-process/permissive-output-validator.js +10 -0
  173. package/dist/trusted-process/permissive-output-validator.js.map +1 -0
  174. package/dist/trusted-process/policy-engine.d.ts +27 -4
  175. package/dist/trusted-process/policy-engine.js +152 -57
  176. package/dist/trusted-process/policy-engine.js.map +1 -1
  177. package/dist/trusted-process/tool-description-hints.d.ts +19 -0
  178. package/dist/trusted-process/tool-description-hints.js +53 -0
  179. package/dist/trusted-process/tool-description-hints.js.map +1 -0
  180. package/dist/types/argument-roles.d.ts +33 -1
  181. package/dist/types/argument-roles.js +129 -1
  182. package/dist/types/argument-roles.js.map +1 -1
  183. package/docker/Dockerfile.goose +34 -0
  184. package/docker/entrypoint-goose.sh +30 -0
  185. package/package.json +1 -1
  186. package/src/config/generated/tool-annotations.json +487 -338
  187. package/src/config/mcp-servers.json +2 -8
@@ -0,0 +1,121 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ /**
5
+ * Allowlisted git URI schemes. Git's ext:: protocol allows arbitrary
6
+ * command execution and must never be accepted.
7
+ *
8
+ * Accepted forms:
9
+ * - https://host/repo.git
10
+ * - http://host/repo.git
11
+ * - ssh://user@host/repo.git
12
+ * - git://host/repo.git
13
+ * - git@host:org/repo.git (SCP-style shorthand for SSH)
14
+ * - file:///path/to/repo
15
+ */
16
+ const SAFE_URI_PATTERNS = [
17
+ /^https:\/\//i,
18
+ /^http:\/\//i,
19
+ /^ssh:\/\//i,
20
+ /^git:\/\//i,
21
+ /^file:\/\//i,
22
+ /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+:/, // SCP-style: user@host:path
23
+ ];
24
+ /**
25
+ * Validates that a git URI uses a safe transport protocol.
26
+ *
27
+ * Rejects dangerous protocols like ext:: which allow arbitrary
28
+ * command execution, and any other unrecognized scheme.
29
+ *
30
+ * @throws {Error} if the URI uses a disallowed protocol
31
+ */
32
+ export function validateGitUri(uri) {
33
+ const trimmed = uri.trim();
34
+ if (!trimmed) {
35
+ throw new Error('Git URI must not be empty');
36
+ }
37
+ const isSafe = SAFE_URI_PATTERNS.some((pattern) => pattern.test(trimmed));
38
+ if (!isSafe) {
39
+ throw new Error(`Rejected git URI with disallowed protocol: "${trimmed}". ` +
40
+ `Only https, http, ssh, git, file, and SCP-style (user@host:path) URIs are allowed.`);
41
+ }
42
+ }
43
+ /**
44
+ * Determines the remote's default branch by inspecting origin/HEAD.
45
+ * Falls back to 'main' if the symbolic ref is not set.
46
+ */
47
+ function resolveDefaultBranch(dir, env) {
48
+ try {
49
+ // origin/HEAD is set automatically on clone; resolve it to a branch name.
50
+ const ref = execFileSync('git', ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], {
51
+ cwd: dir,
52
+ stdio: 'pipe',
53
+ env,
54
+ })
55
+ .toString()
56
+ .trim();
57
+ // ref is "origin/main" or "origin/master" — strip the "origin/" prefix.
58
+ return ref.replace(/^origin\//, '');
59
+ }
60
+ catch {
61
+ // origin/HEAD may not exist if the repo was cloned with an old git version
62
+ // or if HEAD was never set. Probe for common default branch names.
63
+ for (const candidate of ['main', 'master']) {
64
+ try {
65
+ execFileSync('git', ['rev-parse', '--verify', `origin/${candidate}`], {
66
+ cwd: dir,
67
+ stdio: 'pipe',
68
+ env,
69
+ });
70
+ return candidate;
71
+ }
72
+ catch {
73
+ // Branch doesn't exist, try next
74
+ }
75
+ }
76
+ return 'main';
77
+ }
78
+ }
79
+ /**
80
+ * Clones or refreshes a git repository in the given directory.
81
+ *
82
+ * - First call: clones the repo into dir (dir must exist and be empty)
83
+ * - Subsequent calls: fetches from origin and resets tracked files to
84
+ * FETCH_HEAD, leaving untracked files (agent artifacts) intact.
85
+ *
86
+ * @param verbose Pass true to inherit stdio (show git output in terminal)
87
+ * @returns diff --stat of tracked-file changes discarded by a hard reset,
88
+ * or null on first clone / when there are no local changes.
89
+ * @throws {Error} if the URI uses a disallowed protocol
90
+ */
91
+ export function syncGitRepo(uri, dir, verbose = false) {
92
+ validateGitUri(uri);
93
+ const stdio = verbose ? 'inherit' : 'pipe';
94
+ const env = { ...process.env, GIT_ALLOW_PROTOCOL: 'https:http:ssh:git:file' };
95
+ if (existsSync(resolve(dir, '.git'))) {
96
+ execFileSync('git', ['fetch', 'origin'], { cwd: dir, stdio, env });
97
+ // Resolve the remote's default branch (e.g., main, master).
98
+ const defaultBranch = resolveDefaultBranch(dir, env);
99
+ const target = `origin/${defaultBranch}`;
100
+ // Capture tracked-file changes that will be discarded by the hard reset.
101
+ let discarded = null;
102
+ try {
103
+ const diff = execFileSync('git', ['diff', '--stat', target], { cwd: dir, stdio: 'pipe', env });
104
+ const diffStr = diff.toString().trim();
105
+ if (diffStr) {
106
+ discarded = diffStr;
107
+ }
108
+ }
109
+ catch {
110
+ // Non-fatal: proceed with reset even if diff fails
111
+ }
112
+ // Ensure the default branch is checked out, then reset to latest remote.
113
+ execFileSync('git', ['checkout', '-B', defaultBranch, target], { cwd: dir, stdio, env });
114
+ return discarded;
115
+ }
116
+ else {
117
+ execFileSync('git', ['clone', '--', uri, '.'], { cwd: dir, stdio, env });
118
+ return null;
119
+ }
120
+ }
121
+ //# sourceMappingURL=git-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-sync.js","sourceRoot":"","sources":["../../src/cron/git-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * HeadlessTransport -- Minimal transport for headless cron sessions.
3
+ *
4
+ * Unlike SignalSessionTransport which blocks run() indefinitely,
5
+ * HeadlessTransport's run() resolves when the single-shot task
6
+ * message completes. It does not accept follow-up messages.
7
+ *
8
+ * Escalations raised during the cron session follow the normal
9
+ * daemon escalation resolution path and will be auto-denied
10
+ * if no human approval is provided within the timeout.
11
+ */
12
+ import { BaseTransport } from '../session/base-transport.js';
13
+ import type { Session } from '../session/types.js';
14
+ export interface HeadlessTransportOptions {
15
+ /** The initial task message to send. */
16
+ readonly taskMessage: string;
17
+ }
18
+ export declare class HeadlessTransport extends BaseTransport {
19
+ private readonly taskMessage;
20
+ private response;
21
+ private closed;
22
+ constructor(options: HeadlessTransportOptions);
23
+ protected runSession(session: Session): Promise<void>;
24
+ /** Returns the agent's response from the task. */
25
+ getResponse(): string | undefined;
26
+ close(): void;
27
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * HeadlessTransport -- Minimal transport for headless cron sessions.
3
+ *
4
+ * Unlike SignalSessionTransport which blocks run() indefinitely,
5
+ * HeadlessTransport's run() resolves when the single-shot task
6
+ * message completes. It does not accept follow-up messages.
7
+ *
8
+ * Escalations raised during the cron session follow the normal
9
+ * daemon escalation resolution path and will be auto-denied
10
+ * if no human approval is provided within the timeout.
11
+ */
12
+ import { BaseTransport } from '../session/base-transport.js';
13
+ import * as logger from '../logger.js';
14
+ export class HeadlessTransport extends BaseTransport {
15
+ taskMessage;
16
+ response;
17
+ closed = false;
18
+ constructor(options) {
19
+ super();
20
+ this.taskMessage = options.taskMessage;
21
+ }
22
+ async runSession(session) {
23
+ if (this.closed)
24
+ return;
25
+ try {
26
+ logger.info(`[HeadlessTransport] Sending task message (${this.taskMessage.length} chars)`);
27
+ this.response = await this.sendAndLog(session, this.taskMessage);
28
+ logger.info(`[HeadlessTransport] Task completed, response: ${this.response.length} chars`);
29
+ }
30
+ catch (err) {
31
+ logger.warn(`[HeadlessTransport] Task failed: ${err instanceof Error ? err.message : String(err)}`);
32
+ throw err;
33
+ }
34
+ }
35
+ /** Returns the agent's response from the task. */
36
+ getResponse() {
37
+ return this.response;
38
+ }
39
+ close() {
40
+ this.closed = true;
41
+ }
42
+ }
43
+ //# sourceMappingURL=headless-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-transport.js","sourceRoot":"","sources":["../../src/cron/headless-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAOvC,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACjC,WAAW,CAAS;IAC7B,QAAQ,CAAqB;IAC7B,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,OAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,OAAgB;QACzC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,6CAA6C,IAAI,CAAC,WAAW,CAAC,MAAM,SAAS,CAAC,CAAC;YAC3F,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,iDAAiD,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpG,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * CLI subcommands for cron job management.
3
+ *
4
+ * These commands work without a running daemon -- they read/write
5
+ * job files directly from ~/.ironcurtain/jobs/. When a daemon is
6
+ * running, daemon-command.ts forwards commands via the control socket
7
+ * instead of calling these functions directly.
8
+ */
9
+ import { type JobDefinition, type RunRecord } from './types.js';
10
+ /** Creates a new scheduled job interactively. */
11
+ export declare function runAddJobWizard(): Promise<void>;
12
+ /** Edits an existing job interactively. Re-compiles policy if task changed. */
13
+ export declare function runEditJobWizard(jobIdStr: string): Promise<void>;
14
+ export declare function runListJobs(): void;
15
+ /** Daemon job list entry received over the control socket. */
16
+ export interface DaemonJobListEntry {
17
+ job: JobDefinition;
18
+ nextRun: string | null;
19
+ lastRun: RunRecord | undefined;
20
+ isRunning: boolean;
21
+ }
22
+ /**
23
+ * Formats job list data received from the daemon control socket.
24
+ * Used when list-jobs is forwarded to a running daemon, which provides
25
+ * live running status and next-run times from the scheduler.
26
+ */
27
+ export declare function formatDaemonJobList(jobs: DaemonJobListEntry[]): void;
28
+ /** Manually triggers a job run. */
29
+ export declare function runJobCommand(jobIdStr: string): Promise<void>;
30
+ /** Removes a job. Prompts for confirmation unless force is true. */
31
+ export declare function runRemoveJob(jobIdStr: string, force?: boolean): Promise<void>;
32
+ /** Disables a job. */
33
+ export declare const runDisableJob: (jobIdStr: string) => Promise<void>;
34
+ /** Enables a job. */
35
+ export declare const runEnableJob: (jobIdStr: string) => Promise<void>;
36
+ /** Re-runs policy compilation for a job. */
37
+ export declare function runRecompileJob(jobIdStr: string): Promise<void>;
38
+ /** Shows recent run logs for a job. */
39
+ export declare function runShowLogs(jobIdStr: string, limit: number): void;