@pentoshi/clai 3.11.8 → 3.11.10

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 (142) hide show
  1. package/README.md +15 -0
  2. package/dist/agent/confirm-port.d.ts +4 -0
  3. package/dist/agent/confirm-port.js +9 -1
  4. package/dist/agent/confirm-port.js.map +1 -1
  5. package/dist/agent/context-manager.d.ts +3 -4
  6. package/dist/agent/context-manager.js +3 -4
  7. package/dist/agent/context-manager.js.map +1 -1
  8. package/dist/agent/reliability-policy.d.ts +5 -3
  9. package/dist/agent/reliability-policy.js +5 -1
  10. package/dist/agent/reliability-policy.js.map +1 -1
  11. package/dist/agent/request-budget.d.ts +7 -3
  12. package/dist/agent/request-budget.js +24 -7
  13. package/dist/agent/request-budget.js.map +1 -1
  14. package/dist/agent/runner.d.ts +2 -0
  15. package/dist/agent/runner.js +24 -14
  16. package/dist/agent/runner.js.map +1 -1
  17. package/dist/agent/tool-call-parser.js +3 -0
  18. package/dist/agent/tool-call-parser.js.map +1 -1
  19. package/dist/app/adapters/current-agent-adapter.js +1 -0
  20. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  21. package/dist/app/adapters/current-interactive-sessions-adapter.d.ts +4 -0
  22. package/dist/app/adapters/current-interactive-sessions-adapter.js +12 -0
  23. package/dist/app/adapters/current-interactive-sessions-adapter.js.map +1 -0
  24. package/dist/app/controllers/cancel-all-result.d.ts +8 -0
  25. package/dist/app/controllers/cancel-all-result.js +32 -0
  26. package/dist/app/controllers/cancel-all-result.js.map +1 -0
  27. package/dist/app/controllers/session-context-limits.d.ts +12 -0
  28. package/dist/app/controllers/session-context-limits.js +29 -0
  29. package/dist/app/controllers/session-context-limits.js.map +1 -0
  30. package/dist/app/controllers/session-context-usage.d.ts +2 -0
  31. package/dist/app/controllers/session-context-usage.js +13 -9
  32. package/dist/app/controllers/session-context-usage.js.map +1 -1
  33. package/dist/app/controllers/session-controller.d.ts +8 -3
  34. package/dist/app/controllers/session-controller.js +45 -10
  35. package/dist/app/controllers/session-controller.js.map +1 -1
  36. package/dist/app/controllers/session-turn-request.d.ts +1 -0
  37. package/dist/app/controllers/session-turn-request.js +3 -0
  38. package/dist/app/controllers/session-turn-request.js.map +1 -1
  39. package/dist/app/ports/agent-port.d.ts +2 -0
  40. package/dist/app/ports/interactive-sessions-port.d.ts +22 -0
  41. package/dist/app/ports/interactive-sessions-port.js +9 -0
  42. package/dist/app/ports/interactive-sessions-port.js.map +1 -0
  43. package/dist/index.js +24 -13
  44. package/dist/index.js.map +1 -1
  45. package/dist/interactive-session/artifact-writer.d.ts +54 -0
  46. package/dist/interactive-session/artifact-writer.js +161 -0
  47. package/dist/interactive-session/artifact-writer.js.map +1 -0
  48. package/dist/interactive-session/cleanup.d.ts +37 -0
  49. package/dist/interactive-session/cleanup.js +191 -0
  50. package/dist/interactive-session/cleanup.js.map +1 -0
  51. package/dist/interactive-session/config.d.ts +118 -0
  52. package/dist/interactive-session/config.js +141 -0
  53. package/dist/interactive-session/config.js.map +1 -0
  54. package/dist/interactive-session/input-policy.d.ts +26 -0
  55. package/dist/interactive-session/input-policy.js +70 -0
  56. package/dist/interactive-session/input-policy.js.map +1 -0
  57. package/dist/interactive-session/manager.d.ts +118 -0
  58. package/dist/interactive-session/manager.js +1214 -0
  59. package/dist/interactive-session/manager.js.map +1 -0
  60. package/dist/interactive-session/output-store.d.ts +81 -0
  61. package/dist/interactive-session/output-store.js +239 -0
  62. package/dist/interactive-session/output-store.js.map +1 -0
  63. package/dist/interactive-session/output-view.d.ts +20 -0
  64. package/dist/interactive-session/output-view.js +142 -0
  65. package/dist/interactive-session/output-view.js.map +1 -0
  66. package/dist/interactive-session/recovery-journal.d.ts +53 -0
  67. package/dist/interactive-session/recovery-journal.js +167 -0
  68. package/dist/interactive-session/recovery-journal.js.map +1 -0
  69. package/dist/interactive-session/registry.d.ts +59 -0
  70. package/dist/interactive-session/registry.js +170 -0
  71. package/dist/interactive-session/registry.js.map +1 -0
  72. package/dist/interactive-session/runtime.d.ts +107 -0
  73. package/dist/interactive-session/runtime.js +191 -0
  74. package/dist/interactive-session/runtime.js.map +1 -0
  75. package/dist/interactive-session/session-runtime.d.ts +53 -0
  76. package/dist/interactive-session/session-runtime.js +65 -0
  77. package/dist/interactive-session/session-runtime.js.map +1 -0
  78. package/dist/interactive-session/streaming-redactor.d.ts +53 -0
  79. package/dist/interactive-session/streaming-redactor.js +271 -0
  80. package/dist/interactive-session/streaming-redactor.js.map +1 -0
  81. package/dist/interactive-session/telemetry.d.ts +30 -0
  82. package/dist/interactive-session/telemetry.js +47 -0
  83. package/dist/interactive-session/telemetry.js.map +1 -0
  84. package/dist/interactive-session/transport-factory.d.ts +8 -0
  85. package/dist/interactive-session/transport-factory.js +16 -0
  86. package/dist/interactive-session/transport-factory.js.map +1 -0
  87. package/dist/interactive-session/transport-node-pty.d.ts +38 -0
  88. package/dist/interactive-session/transport-node-pty.js +390 -0
  89. package/dist/interactive-session/transport-node-pty.js.map +1 -0
  90. package/dist/interactive-session/transport-pipe.d.ts +9 -0
  91. package/dist/interactive-session/transport-pipe.js +267 -0
  92. package/dist/interactive-session/transport-pipe.js.map +1 -0
  93. package/dist/interactive-session/transport.d.ts +110 -0
  94. package/dist/interactive-session/transport.js +89 -0
  95. package/dist/interactive-session/transport.js.map +1 -0
  96. package/dist/interactive-session/types.d.ts +258 -0
  97. package/dist/interactive-session/types.js +191 -0
  98. package/dist/interactive-session/types.js.map +1 -0
  99. package/dist/llm/token-usage.d.ts +3 -2
  100. package/dist/llm/token-usage.js +6 -3
  101. package/dist/llm/token-usage.js.map +1 -1
  102. package/dist/os/process-identity.d.ts +46 -0
  103. package/dist/os/process-identity.js +147 -0
  104. package/dist/os/process-identity.js.map +1 -0
  105. package/dist/os/process-tree.d.ts +1 -0
  106. package/dist/os/process-tree.js +11 -0
  107. package/dist/os/process-tree.js.map +1 -1
  108. package/dist/prompts/embedded.js +1 -1
  109. package/dist/prompts/embedded.js.map +1 -1
  110. package/dist/prompts/system.agent.md +3 -0
  111. package/dist/repl.js +16 -1
  112. package/dist/repl.js.map +1 -1
  113. package/dist/safety/classifier.d.ts +9 -0
  114. package/dist/safety/classifier.js +119 -18
  115. package/dist/safety/classifier.js.map +1 -1
  116. package/dist/safety/engagement-policy.d.ts +13 -0
  117. package/dist/safety/engagement-policy.js +129 -34
  118. package/dist/safety/engagement-policy.js.map +1 -1
  119. package/dist/store/config.js +1 -1
  120. package/dist/tools/definitions.js +94 -0
  121. package/dist/tools/definitions.js.map +1 -1
  122. package/dist/tools/interactive-session-tools.d.ts +11 -0
  123. package/dist/tools/interactive-session-tools.js +276 -0
  124. package/dist/tools/interactive-session-tools.js.map +1 -0
  125. package/dist/tools/registry.js +3 -0
  126. package/dist/tools/registry.js.map +1 -1
  127. package/dist/tui-v2/bootstrap/composition-root.d.ts +3 -0
  128. package/dist/tui-v2/bootstrap/composition-root.js +9 -0
  129. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
  130. package/dist/tui-v2/bootstrap/start-tui-v2.js +8 -0
  131. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  132. package/dist/tui-v2/components/status/context-limit-chip.d.ts +17 -0
  133. package/dist/tui-v2/components/status/context-limit-chip.js +72 -0
  134. package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -0
  135. package/dist/tui-v2/components/status/status-line.d.ts +3 -4
  136. package/dist/tui-v2/components/status/status-line.js +6 -17
  137. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  138. package/dist/types.d.ts +1 -0
  139. package/dist/version.generated.d.ts +2 -2
  140. package/dist/version.generated.js +2 -2
  141. package/dist/version.generated.js.map +1 -1
  142. package/package.json +7 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/interactive-session/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type RiskDecision } from "../safety/classifier.js";
2
+ import type { EngagementScope } from "../store/scope.js";
3
+ import type { SessionInput, SessionTransportKind } from "./types.js";
4
+ export interface InputPolicyContext {
5
+ readonly ownerId: string;
6
+ readonly sessionId: string;
7
+ readonly transport: SessionTransportKind;
8
+ readonly input: SessionInput;
9
+ readonly scope?: EngagementScope | undefined;
10
+ }
11
+ export declare function classifyInteractiveInput(context: InputPolicyContext): RiskDecision;
12
+ export declare function describeInput(input: SessionInput): string;
13
+ export interface ApprovalBinding {
14
+ readonly ownerId: string;
15
+ readonly sessionId: string;
16
+ readonly input: SessionInput;
17
+ readonly decision: RiskDecision["level"];
18
+ }
19
+ export declare class ApprovalTokenVault {
20
+ private readonly now;
21
+ private readonly tokens;
22
+ constructor(now?: () => number);
23
+ mint(binding: ApprovalBinding): string;
24
+ consume(token: string | undefined, binding: ApprovalBinding): boolean;
25
+ private sweep;
26
+ }
@@ -0,0 +1,70 @@
1
+ import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { maskSecret } from "../llm/provider.js";
3
+ import { classifyInteractiveInput as classifyInput, } from "../safety/classifier.js";
4
+ export function classifyInteractiveInput(context) {
5
+ return classifyInput(context);
6
+ }
7
+ export function describeInput(input) {
8
+ if (input.kind === "eof")
9
+ return "close session input (EOF)";
10
+ if (input.kind === "control")
11
+ return `control: ${input.control}`;
12
+ if (input.kind === "secret") {
13
+ return `${input.submit === "enter" ? "submit" : "type"}: [secret]`;
14
+ }
15
+ const trimmed = input.text.trim();
16
+ const preview = trimmed.length > 120 ? `${trimmed.slice(0, 120)}…` : trimmed;
17
+ const body = /^[\x20-\x7e]*$/.test(preview) ? preview : maskSecret(preview);
18
+ return `${input.submit === "enter" ? "submit" : "type"}: ${body}`;
19
+ }
20
+ const TOKEN_TTL_MS = 60_000;
21
+ const digestKey = randomBytes(32);
22
+ function bindingDigest(binding) {
23
+ const { input } = binding;
24
+ const parts = [
25
+ binding.ownerId,
26
+ binding.sessionId,
27
+ input.kind,
28
+ input.kind === "text" ? input.text : input.kind === "secret" ? input.value : input.kind === "control" ? input.control : "",
29
+ input.kind === "text" || input.kind === "secret" ? input.submit : "",
30
+ binding.decision,
31
+ ];
32
+ return createHmac("sha256", digestKey).update(parts.join("\u0000")).digest("hex");
33
+ }
34
+ export class ApprovalTokenVault {
35
+ now;
36
+ tokens = new Map();
37
+ constructor(now = Date.now) {
38
+ this.now = now;
39
+ }
40
+ mint(binding) {
41
+ this.sweep();
42
+ const token = randomBytes(24).toString("base64url");
43
+ this.tokens.set(token, {
44
+ digest: bindingDigest(binding),
45
+ expiresAt: this.now() + TOKEN_TTL_MS,
46
+ });
47
+ return token;
48
+ }
49
+ consume(token, binding) {
50
+ if (!token)
51
+ return false;
52
+ const entry = this.tokens.get(token);
53
+ if (!entry)
54
+ return false;
55
+ this.tokens.delete(token);
56
+ if (entry.expiresAt <= this.now())
57
+ return false;
58
+ const expected = Buffer.from(bindingDigest(binding), "utf8");
59
+ const actual = Buffer.from(entry.digest, "utf8");
60
+ return expected.length === actual.length && timingSafeEqual(expected, actual);
61
+ }
62
+ sweep() {
63
+ const now = this.now();
64
+ for (const [token, entry] of this.tokens) {
65
+ if (entry.expiresAt <= now)
66
+ this.tokens.delete(token);
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=input-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-policy.js","sourceRoot":"","sources":["../../src/interactive-session/input-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,wBAAwB,IAAI,aAAa,GAG1C,MAAM,yBAAyB,CAAC;AAYjC,MAAM,UAAU,wBAAwB,CACtC,OAA2B;IAE3B,OAAO,aAAa,CAAC,OAAwC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,2BAA2B,CAAC;IAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC;IACjE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC;IACrE,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5E,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;AASlC,SAAS,aAAa,CAAC,OAAwB;IAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,SAAS;QACjB,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC1H,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACpE,OAAO,CAAC,QAAQ;KACjB,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,OAAO,kBAAkB;IAGA;IAFZ,MAAM,GAAG,IAAI,GAAG,EAAiD,CAAC;IAEnF,YAA6B,MAAoB,IAAI,CAAC,GAAG;QAA5B,QAAG,GAAH,GAAG,CAAyB;IAAG,CAAC;IAE7D,IAAI,CAAC,OAAwB;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;YACrB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY;SACrC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,KAAyB,EAAE,OAAwB;QACzD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Interactive session manager: the single owner of persistent interactive
3
+ * process lifecycle.
4
+ *
5
+ * Ownership is conversation-scoped. Every operation requires an owner id, and a
6
+ * lookup for another owner is indistinguishable from a missing session so the
7
+ * manager cannot be used as an existence oracle. Direct user-terminal handoff is
8
+ * outside this contract by design.
9
+ */
10
+ import type { EngagementScope } from "../store/scope.js";
11
+ import { type InteractiveSessionConfig, type InteractiveSessionOverrides } from "./config.js";
12
+ import { RecoveryJournal, type ReconciliationEntry } from "./recovery-journal.js";
13
+ import { type Clock } from "./runtime.js";
14
+ import { SessionTelemetry } from "./telemetry.js";
15
+ import { type SessionTransportFactory } from "./transport.js";
16
+ import { type CloseAllResult, type CloseOwnerResult, type CloseRequest, type CloseResult, type ListResult, type ReadRequest, type ReadResult, type ResizeRequest, type ResizeResult, type SendRequest, type SendResult, type SessionInput, type SessionOperation, type StartRequest, type StartResult, type StatusResult, type TerminationReason } from "./types.js";
17
+ /** Confirmation surface for a `confirm`-level action. Previews are redacted. */
18
+ export type ConfirmPreview = (request: {
19
+ readonly title: string;
20
+ readonly description: string;
21
+ readonly reason: string;
22
+ }) => Promise<boolean>;
23
+ export interface ManagerRequestExtras {
24
+ readonly confirm?: ConfirmPreview | undefined;
25
+ readonly scope?: EngagementScope | undefined;
26
+ }
27
+ export interface InteractiveSessionManagerDeps {
28
+ readonly config?: InteractiveSessionOverrides | undefined;
29
+ readonly transports?: SessionTransportFactory | undefined;
30
+ readonly clock?: Clock | undefined;
31
+ readonly journal?: RecoveryJournal | undefined;
32
+ readonly telemetry?: SessionTelemetry | undefined;
33
+ readonly artifactBaseDir?: string | undefined;
34
+ }
35
+ export declare class InteractiveSessionManager {
36
+ private readonly registry;
37
+ private readonly runtimes;
38
+ private readonly approvals;
39
+ private readonly telemetry;
40
+ private readonly journal;
41
+ private readonly cleanup;
42
+ private readonly transports;
43
+ private readonly clock;
44
+ private readonly baseConfig;
45
+ private readonly artifactBaseDir;
46
+ private readonly ownerCloses;
47
+ private readonly ownerActivations;
48
+ private readonly pendingStarts;
49
+ private readonly lateLaunches;
50
+ constructor(deps?: InteractiveSessionManagerDeps);
51
+ get config(): InteractiveSessionConfig;
52
+ /** Reconcile crashed-session records. Must run before tools are enabled. */
53
+ reconcileOrphans(): ReconciliationEntry[];
54
+ ptyCapability(): Promise<{
55
+ available: boolean;
56
+ reason?: string | undefined;
57
+ }>;
58
+ start(request: StartRequest & ManagerRequestExtras): Promise<StartResult>;
59
+ private startManaged;
60
+ private launchError;
61
+ private launchWithDeadline;
62
+ send(request: SendRequest & ManagerRequestExtras): Promise<SendResult>;
63
+ private sendError;
64
+ /**
65
+ * Acceptance is all-or-nothing under the mutation lock: either the whole action
66
+ * is reserved within the backpressure bound, or no sequence or queue state
67
+ * changes at all.
68
+ */
69
+ private accept;
70
+ private assertControlSupported;
71
+ /**
72
+ * Quiet detection starts at delivery completion: only output observed after
73
+ * this point resets the quiet timer, while the absolute deadline never extends.
74
+ */
75
+ private gather;
76
+ read(request: ReadRequest): Promise<ReadResult>;
77
+ private waitForOutput;
78
+ status(request: {
79
+ ownerId: string;
80
+ id: string;
81
+ }): StatusResult;
82
+ list(request: {
83
+ ownerId: string;
84
+ }): ListResult;
85
+ resize(request: ResizeRequest): Promise<ResizeResult>;
86
+ close(request: CloseRequest): Promise<CloseResult>;
87
+ /** Owner cancellation: closes every live session owned by a conversation. */
88
+ cancelOwner(ownerId: string): Promise<CloseOwnerResult>;
89
+ /**
90
+ * Fence an owner synchronously, then start one tracked close. Callers rebinding
91
+ * a conversation id must fence before the old id becomes unreachable.
92
+ */
93
+ beginCloseOwner(ownerId: string, reason?: TerminationReason): Promise<CloseOwnerResult>;
94
+ /** Await any teardown already started for an owner. */
95
+ awaitOwnerClose(ownerId: string): Promise<void>;
96
+ activateOwner(ownerId: string): Promise<void>;
97
+ private awaitOwnerActivation;
98
+ closeAll(reason?: TerminationReason): Promise<CloseAllResult>;
99
+ private closeOwnerSessions;
100
+ private finalizeRecord;
101
+ private finalize;
102
+ private authorizeCommand;
103
+ private authorizeInput;
104
+ private registerPendingStart;
105
+ private trackLateLaunch;
106
+ private cancelPendingStarts;
107
+ private releaseUnmanagedTransport;
108
+ private throwIfCancelled;
109
+ private assertOwner;
110
+ private assertNotFenced;
111
+ private assertEnabled;
112
+ private notFound;
113
+ private requireRuntime;
114
+ }
115
+ /** Strict validation of the dependent input fields before acceptance. */
116
+ export declare function validateInput(input: SessionInput | undefined, operation: SessionOperation): SessionInput;
117
+ /** Process-wide manager, mirroring the existing process-wide job manager. */
118
+ export declare const interactiveSessionManager: InteractiveSessionManager;