@cortexkit/aft-bridge 0.62.0 → 0.63.4

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 (90) hide show
  1. package/dist/bash-env.d.ts +28 -0
  2. package/dist/bash-env.d.ts.map +1 -0
  3. package/dist/bash-env.js +161 -0
  4. package/dist/bash-env.js.map +1 -0
  5. package/dist/bash-hints.js +1 -1
  6. package/dist/bash-hints.js.map +1 -1
  7. package/dist/bash-host-fallback.d.ts +7 -2
  8. package/dist/bash-host-fallback.d.ts.map +1 -1
  9. package/dist/bash-host-fallback.js +7 -2
  10. package/dist/bash-host-fallback.js.map +1 -1
  11. package/dist/bash-output-page.d.ts +35 -0
  12. package/dist/bash-output-page.d.ts.map +1 -0
  13. package/dist/bash-output-page.js +78 -0
  14. package/dist/bash-output-page.js.map +1 -0
  15. package/dist/bash-pattern-ack.d.ts +21 -0
  16. package/dist/bash-pattern-ack.d.ts.map +1 -0
  17. package/dist/bash-pattern-ack.js +60 -0
  18. package/dist/bash-pattern-ack.js.map +1 -0
  19. package/dist/bash-permissions.d.ts +23 -0
  20. package/dist/bash-permissions.d.ts.map +1 -0
  21. package/dist/bash-permissions.js +84 -0
  22. package/dist/bash-permissions.js.map +1 -0
  23. package/dist/bash-watch-lines.d.ts +11 -0
  24. package/dist/bash-watch-lines.d.ts.map +1 -0
  25. package/dist/bash-watch-lines.js +91 -0
  26. package/dist/bash-watch-lines.js.map +1 -0
  27. package/dist/bash-watch-progress.d.ts +34 -0
  28. package/dist/bash-watch-progress.d.ts.map +1 -0
  29. package/dist/bash-watch-progress.js +154 -0
  30. package/dist/bash-watch-progress.js.map +1 -0
  31. package/dist/bridge.d.ts +207 -24
  32. package/dist/bridge.d.ts.map +1 -1
  33. package/dist/bridge.js +393 -81
  34. package/dist/bridge.js.map +1 -1
  35. package/dist/callgraph-format.d.ts.map +1 -1
  36. package/dist/callgraph-format.js +36 -12
  37. package/dist/callgraph-format.js.map +1 -1
  38. package/dist/command-timeouts.d.ts +13 -0
  39. package/dist/command-timeouts.d.ts.map +1 -1
  40. package/dist/command-timeouts.js +34 -0
  41. package/dist/command-timeouts.js.map +1 -1
  42. package/dist/config-watch.d.ts +2 -0
  43. package/dist/config-watch.d.ts.map +1 -1
  44. package/dist/config-watch.js +2 -0
  45. package/dist/config-watch.js.map +1 -1
  46. package/dist/edit-summary.d.ts +2 -0
  47. package/dist/edit-summary.d.ts.map +1 -1
  48. package/dist/edit-summary.js +9 -1
  49. package/dist/edit-summary.js.map +1 -1
  50. package/dist/feature-config.d.ts +32 -4
  51. package/dist/feature-config.d.ts.map +1 -1
  52. package/dist/feature-config.js +127 -8
  53. package/dist/feature-config.js.map +1 -1
  54. package/dist/index.d.ts +14 -5
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +13 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/logger.d.ts +4 -0
  59. package/dist/logger.d.ts.map +1 -1
  60. package/dist/lsp-github-install.d.ts +20 -0
  61. package/dist/lsp-github-install.d.ts.map +1 -1
  62. package/dist/lsp-github-install.js +39 -69
  63. package/dist/lsp-github-install.js.map +1 -1
  64. package/dist/lsp-github-probe.d.ts +11 -1
  65. package/dist/lsp-github-probe.d.ts.map +1 -1
  66. package/dist/lsp-github-probe.js +85 -5
  67. package/dist/lsp-github-probe.js.map +1 -1
  68. package/dist/lsp-github-table.d.ts.map +1 -1
  69. package/dist/lsp-github-table.js +5 -1
  70. package/dist/lsp-github-table.js.map +1 -1
  71. package/dist/lsp-npm-policy.d.ts +7 -0
  72. package/dist/lsp-npm-policy.d.ts.map +1 -0
  73. package/dist/lsp-npm-policy.js +125 -0
  74. package/dist/lsp-npm-policy.js.map +1 -0
  75. package/dist/pool.d.ts.map +1 -1
  76. package/dist/pool.js +6 -1
  77. package/dist/pool.js.map +1 -1
  78. package/dist/protocol.d.ts +48 -10
  79. package/dist/protocol.d.ts.map +1 -1
  80. package/dist/protocol.js +11 -0
  81. package/dist/protocol.js.map +1 -1
  82. package/dist/subc-transport.d.ts.map +1 -1
  83. package/dist/subc-transport.js +16 -0
  84. package/dist/subc-transport.js.map +1 -1
  85. package/dist/tool-format.js +2 -2
  86. package/dist/view-token.d.ts +9 -0
  87. package/dist/view-token.d.ts.map +1 -0
  88. package/dist/view-token.js +22 -0
  89. package/dist/view-token.js.map +1 -0
  90. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ export interface BashPermissionAsk {
2
+ kind?: string;
3
+ patterns?: string[];
4
+ always?: string[];
5
+ command?: string;
6
+ cwd?: string;
7
+ grant_id?: string;
8
+ operation?: string;
9
+ reason?: string;
10
+ }
11
+ export declare const BASH_PERMISSION_NOT_SETTLED = "bash permission not settled after {rounds} rounds: still asking for {kind} {path} (operation: {operation}; granted already: {granted})";
12
+ export declare class BashPermissionLoopError extends Error {
13
+ }
14
+ export declare function bashPermissionRetryGrants(ask: BashPermissionAsk): string[];
15
+ export declare function groupBashPermissionAsks(asks: readonly BashPermissionAsk[]): BashPermissionAsk[];
16
+ export declare function escalationAskText(ask: BashPermissionAsk): string;
17
+ /** Hosts provide approval UI; this helper passes approved grants to retries and limits rounds. */
18
+ export declare function withBashPermissionLoop(options: {
19
+ request: (granted: readonly string[]) => Promise<Record<string, unknown>>;
20
+ approve: (asks: readonly BashPermissionAsk[]) => Promise<void>;
21
+ operation?: string;
22
+ }): Promise<Record<string, unknown>>;
23
+ //# sourceMappingURL=bash-permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-permissions.d.ts","sourceRoot":"","sources":["../src/bash-permissions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,2BAA2B,2IACkG,CAAC;AAE3I,qBAAa,uBAAwB,SAAQ,KAAK;CAAG;AAErD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAG1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAgB/F;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAEhE;AAED,kGAAkG;AAClG,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoDnC"}
@@ -0,0 +1,84 @@
1
+ import { log } from "./active-logger.js";
2
+ export const BASH_PERMISSION_NOT_SETTLED = "bash permission not settled after {rounds} rounds: still asking for {kind} {path} (operation: {operation}; granted already: {granted})";
3
+ export class BashPermissionLoopError extends Error {
4
+ }
5
+ export function bashPermissionRetryGrants(ask) {
6
+ if (ask.kind === "escalation")
7
+ return ask.grant_id ? [ask.grant_id] : [];
8
+ return ask.always?.length ? ask.always : (ask.patterns ?? []);
9
+ }
10
+ export function groupBashPermissionAsks(asks) {
11
+ const grouped = [];
12
+ let bash;
13
+ for (const ask of asks) {
14
+ if (ask.kind !== "bash" || ask.reason) {
15
+ grouped.push(ask);
16
+ continue;
17
+ }
18
+ if (!bash) {
19
+ bash = { kind: "bash", patterns: [], always: [] };
20
+ grouped.push(bash);
21
+ }
22
+ bash.patterns = [...new Set([...(bash.patterns ?? []), ...(ask.patterns ?? [])])];
23
+ bash.always = [...new Set([...(bash.always ?? []), ...(ask.always ?? [])])];
24
+ }
25
+ return grouped;
26
+ }
27
+ export function escalationAskText(ask) {
28
+ return `This command will run UNSANDBOXED on the host.\n\nExact command:\n${ask.command ?? ""}\n\nWorking directory:\n${ask.cwd ?? ""}`;
29
+ }
30
+ /** Hosts provide approval UI; this helper passes approved grants to retries and limits rounds. */
31
+ export async function withBashPermissionLoop(options) {
32
+ const granted = new Set();
33
+ const alreadyGranted = (ask) => {
34
+ const grants = bashPermissionRetryGrants(ask);
35
+ return grants.length > 0 && grants.every((grant) => granted.has(grant));
36
+ };
37
+ for (let round = 0;; round++) {
38
+ const response = await options.request([...granted]);
39
+ if (response.success !== false || response.code !== "permission_required")
40
+ return response;
41
+ const asks = Array.isArray(response.asks) ? response.asks : [];
42
+ log("bash permission round", {
43
+ round,
44
+ operation: options.operation ?? "bash",
45
+ asks: asks.map((ask) => ({
46
+ kind: ask.kind,
47
+ patterns: ask.patterns,
48
+ always: ask.always,
49
+ already_granted: alreadyGranted(ask),
50
+ })),
51
+ });
52
+ const unsettled = (cause) => {
53
+ const message = (asks.length ? asks : [{}])
54
+ .map((ask) => {
55
+ const paths = ask.patterns?.length ? ask.patterns : bashPermissionRetryGrants(ask);
56
+ const path = ask.kind === "escalation" && ask.command
57
+ ? `${ask.command}${ask.cwd ? ` @ ${ask.cwd}` : ""}`
58
+ : paths.length
59
+ ? paths.join(", ")
60
+ : "<no asks returned>";
61
+ return BASH_PERMISSION_NOT_SETTLED.replace("{rounds}", String(round))
62
+ .replace("{kind}", ask.kind ?? "unknown")
63
+ .replace("{operation}", ask.operation ?? options.operation ?? "bash")
64
+ .replace("{granted}", alreadyGranted(ask) ? "yes" : "no")
65
+ .replace("{path}", () => path);
66
+ })
67
+ .join("; ");
68
+ return new BashPermissionLoopError(cause instanceof Error ? `${message}: ${cause.message}` : message, { cause });
69
+ };
70
+ if (asks.length === 0 || asks.every(alreadyGranted) || round >= 8)
71
+ throw unsettled();
72
+ try {
73
+ await options.approve(asks.filter((ask) => !alreadyGranted(ask)));
74
+ }
75
+ catch (error) {
76
+ throw unsettled(error);
77
+ }
78
+ for (const ask of asks) {
79
+ for (const grant of bashPermissionRetryGrants(ask))
80
+ granted.add(grant);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=bash-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-permissions.js","sourceRoot":"","sources":["../src/bash-permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BashWatchLineBatch } from "./bridge.js";
2
+ export declare const UNAVAILABLE_MATCH_SINGULAR = "1 matching line over {limit} KiB was not shown; AFT can check lines only up to {limit} KiB for secrets.";
3
+ export declare const UNAVAILABLE_MATCH_PLURAL = "{count} matching lines over {limit} KiB were not shown; AFT can check lines only up to {limit} KiB for secrets.";
4
+ export declare const WATCH_EACH_LINE_NEEDS_BACKGROUND = "bash_watch: deliver: \"each_line\" needs background: true.";
5
+ /** Live pushes are deltas; durable replay is a replacement snapshot. */
6
+ export declare function mergeWatchLineBatches(previous: BashWatchLineBatch, next: BashWatchLineBatch): BashWatchLineBatch;
7
+ /** Render masked source lines and copyable, host-specific byte-page recovery calls. */
8
+ export declare function formatWatchLineBatch(taskId: string, batch: BashWatchLineBatch, camelCase: boolean): string;
9
+ /** Page text is masked by the engine; never decode raw transport bytes for display. */
10
+ export declare function formatBashOutputPages(data: Record<string, unknown>, camelCase: boolean): string;
11
+ //# sourceMappingURL=bash-watch-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-watch-lines.d.ts","sourceRoot":"","sources":["../src/bash-watch-lines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD,eAAO,MAAM,0BAA0B,4GACoE,CAAC;AAC5G,eAAO,MAAM,wBAAwB,oHAC8E,CAAC;AAOpH,eAAO,MAAM,gCAAgC,+DACe,CAAC;AAE7D,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,kBAAkB,GACvB,kBAAkB,CAwCpB;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,OAAO,GACjB,MAAM,CAiCR;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAU/F"}
@@ -0,0 +1,91 @@
1
+ const MAX_PENDING_WATCH_LINES = 50;
2
+ const DEFAULT_MASKING_LINE_CAP_BYTES = 8 * 1024;
3
+ export const UNAVAILABLE_MATCH_SINGULAR = "1 matching line over {limit} KiB was not shown; AFT can check lines only up to {limit} KiB for secrets.";
4
+ export const UNAVAILABLE_MATCH_PLURAL = "{count} matching lines over {limit} KiB were not shown; AFT can check lines only up to {limit} KiB for secrets.";
5
+ function unavailableMatchText(count, limit) {
6
+ return (count === 1 ? UNAVAILABLE_MATCH_SINGULAR : UNAVAILABLE_MATCH_PLURAL)
7
+ .replaceAll("{count}", String(count))
8
+ .replaceAll("{limit}", String(Math.ceil(limit / 1024)));
9
+ }
10
+ export const WATCH_EACH_LINE_NEEDS_BACKGROUND = 'bash_watch: deliver: "each_line" needs background: true.';
11
+ /** Live pushes are deltas; durable replay is a replacement snapshot. */
12
+ export function mergeWatchLineBatches(previous, next) {
13
+ if (next.snapshot)
14
+ return next;
15
+ if (previous.pending_id && next.pending_id && previous.pending_id !== next.pending_id)
16
+ return next;
17
+ const merged = { ...previous, lines: previous.lines.map((line) => ({ ...line })) };
18
+ merged.masking_limit_bytes = next.masking_limit_bytes ?? previous.masking_limit_bytes;
19
+ merged.pending_id = next.pending_id ?? previous.pending_id;
20
+ merged.version = next.version ?? previous.version;
21
+ if (next.retry_gap)
22
+ merged.retry_gap = next.retry_gap;
23
+ let retained = merged.lines.reduce((sum, line) => sum + line.count, 0);
24
+ for (const line of next.lines) {
25
+ const keep = Math.min(line.count, MAX_PENDING_WATCH_LINES - retained);
26
+ const dropped = line.count - keep;
27
+ if (dropped > 0 && merged.first_dropped_offset === null) {
28
+ merged.first_dropped_offset = line.offset + keep * (line.end_offset - line.offset);
29
+ merged.first_dropped_stream = line.stream;
30
+ }
31
+ merged.dropped_lines += dropped;
32
+ if (keep > 0) {
33
+ const last = merged.lines.at(-1);
34
+ if (last &&
35
+ last.stream === line.stream &&
36
+ last.text === line.text &&
37
+ Boolean(last.unavailable) === Boolean(line.unavailable) &&
38
+ last.end_offset - last.offset === line.end_offset - line.offset &&
39
+ last.offset + last.count * (last.end_offset - last.offset) === line.offset)
40
+ last.count += keep;
41
+ else
42
+ merged.lines.push({ ...line, count: keep });
43
+ retained += keep;
44
+ }
45
+ }
46
+ merged.dropped_lines += next.dropped_lines;
47
+ merged.skipped_long_lines += next.skipped_long_lines;
48
+ if (merged.first_dropped_offset === null) {
49
+ merged.first_dropped_offset = next.first_dropped_offset;
50
+ merged.first_dropped_stream = next.first_dropped_stream;
51
+ }
52
+ return merged;
53
+ }
54
+ /** Render masked source lines and copyable, host-specific byte-page recovery calls. */
55
+ export function formatWatchLineBatch(taskId, batch, camelCase) {
56
+ const lines = batch.lines.map((line) => `${line.stream} byte ${line.offset}${line.count > 1 ? ` ×${line.count}` : ""}: ${line.unavailable ? unavailableMatchText(line.count, batch.masking_limit_bytes ?? DEFAULT_MASKING_LINE_CAP_BYTES) : line.text}`);
57
+ if (batch.dropped_lines > 0 || batch.skipped_long_lines > 0) {
58
+ const taskKey = camelCase ? "taskId" : "task_id";
59
+ const cursor = batch.first_dropped_stream === "stderr" ? "stderr" : "output";
60
+ const offsetKey = camelCase ? `${cursor}Offset` : `${cursor}_offset`;
61
+ const incomplete = batch.skipped_long_lines > 0
62
+ ? ` ${batch.skipped_long_lines} lines longer than 64 KiB were skipped, so the scan is incomplete.`
63
+ : "";
64
+ lines.push(`${batch.dropped_lines} matching lines dropped.${incomplete} Read them with bash_status({ ${taskKey}: ${JSON.stringify(taskId)}, ${offsetKey}: ${batch.first_dropped_offset ?? 0} }).`);
65
+ }
66
+ if (batch.retry_gap && batch.retry_gap.dropped_notifications > 0) {
67
+ const gap = batch.retry_gap;
68
+ const taskKey = camelCase ? "taskId" : "task_id";
69
+ const cursor = gap.stream === "stderr" ? "stderr" : "output";
70
+ const offsetKey = camelCase ? `${cursor}Offset` : `${cursor}_offset`;
71
+ const missing = gap.known_missing_occurrences === 0
72
+ ? "Some matches may be missing."
73
+ : gap.known_missing_occurrences === 1
74
+ ? "At least 1 match is missing."
75
+ : `At least ${gap.known_missing_occurrences} matches are missing.`;
76
+ lines.push(`Some watch notices were lost: a stalled connection dropped ${gap.dropped_notifications} of them, and they cannot be recovered. ${missing} Read the task output with bash_status({ ${taskKey}: ${JSON.stringify(taskId)}, ${offsetKey}: ${gap.first_offset ?? 0} }).`);
77
+ }
78
+ return lines.join("\n");
79
+ }
80
+ /** Page text is masked by the engine; never decode raw transport bytes for display. */
81
+ export function formatBashOutputPages(data, camelCase) {
82
+ const lines = [];
83
+ for (const stream of ["output", "stderr"]) {
84
+ if (typeof data[`${stream}_page_text`] !== "string")
85
+ continue;
86
+ const next = camelCase ? `${stream}Offset` : `${stream}_offset`;
87
+ lines.push(`${stream} page (next ${next}: ${data[`${stream}_next_offset`]}, has_more: ${data[`${stream}_has_more`]}):\n${data[`${stream}_page_text`]}`);
88
+ }
89
+ return lines.join("\n");
90
+ }
91
+ //# sourceMappingURL=bash-watch-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-watch-lines.js","sourceRoot":"","sources":["../src/bash-watch-lines.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { BashAckTarget } from "./bash-pattern-ack.js";
2
+ import type { BashWatchLineBatch } from "./bridge.js";
3
+ /** Admission watermarks for one pending watch generation; no line text is retained. */
4
+ export declare class WatchBatchProgress {
5
+ private pendingID;
6
+ private version;
7
+ private ends;
8
+ private dropped;
9
+ private skipped;
10
+ private gapNotices;
11
+ private gapOccurrences;
12
+ get admittedVersion(): number | undefined;
13
+ unseen(batch: BashWatchLineBatch): BashWatchLineBatch;
14
+ admit(batch: BashWatchLineBatch): void;
15
+ }
16
+ export declare function watchBatchHasContent(batch: BashWatchLineBatch): boolean;
17
+ type BatchMatch = {
18
+ task_id: string;
19
+ watch_id: string;
20
+ match_offset: number;
21
+ batch?: BashWatchLineBatch;
22
+ };
23
+ /** Watermarks survive failed acknowledgements, but clear on a confirmed ack or absence from the pending list. */
24
+ export declare class WatchBatchAdmissions {
25
+ private readonly watches;
26
+ private key;
27
+ unseen<T extends BatchMatch>(matches: readonly T[]): T[];
28
+ admit(matches: readonly BatchMatch[]): void;
29
+ confirmed(targets: readonly BashAckTarget[]): void;
30
+ reconcile(pending: readonly BatchMatch[]): void;
31
+ get size(): number;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=bash-watch-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-watch-progress.d.ts","sourceRoot":"","sources":["../src/bash-watch-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQtD,uFAAuF;AACvF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,IAAI,CAAuE;IACnF,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAK;IAE3B,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAExC;IAED,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB;IAgDrD,KAAK,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;CAsCvC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAOvE;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,iHAAiH;AACjH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAEjE,OAAO,CAAC,GAAG;IAIX,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE;IAcxD,KAAK,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI;IAU3C,SAAS,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI;IAclD,SAAS,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI;IAK/C,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,154 @@
1
+ function knownStream(stream) {
2
+ return stream === "stdout" || stream === "stderr" || stream === "pty" || stream === "output";
3
+ }
4
+ /** Admission watermarks for one pending watch generation; no line text is retained. */
5
+ export class WatchBatchProgress {
6
+ pendingID;
7
+ version;
8
+ ends = { stdout: 0, stderr: 0, pty: 0, output: 0 };
9
+ dropped = 0;
10
+ skipped = 0;
11
+ gapNotices = 0;
12
+ gapOccurrences = 0;
13
+ get admittedVersion() {
14
+ return this.version;
15
+ }
16
+ unseen(batch) {
17
+ const same = this.pendingID === (batch.pending_id ?? "legacy");
18
+ const obsolete = same &&
19
+ !batch.snapshot &&
20
+ batch.version !== undefined &&
21
+ this.version !== undefined &&
22
+ batch.version <= this.version;
23
+ const lines = [];
24
+ if (!obsolete)
25
+ for (const line of batch.lines) {
26
+ const width = Math.max(1, line.end_offset - line.offset);
27
+ const end = same && knownStream(line.stream) ? this.ends[line.stream] : 0;
28
+ const skip = Math.min(line.count, Math.max(0, Math.ceil((end - line.offset) / width)));
29
+ if (skip < line.count)
30
+ lines.push({
31
+ ...line,
32
+ offset: line.offset + skip * width,
33
+ end_offset: line.end_offset + skip * width,
34
+ count: line.count - skip,
35
+ });
36
+ }
37
+ return {
38
+ ...batch,
39
+ lines,
40
+ dropped_lines: obsolete
41
+ ? 0
42
+ : Math.max(0, batch.dropped_lines - (same && batch.snapshot ? this.dropped : 0)),
43
+ skipped_long_lines: obsolete
44
+ ? 0
45
+ : Math.max(0, batch.skipped_long_lines - (same && batch.snapshot ? this.skipped : 0)),
46
+ retry_gap: batch.retry_gap
47
+ ? {
48
+ ...batch.retry_gap,
49
+ dropped_notifications: obsolete
50
+ ? 0
51
+ : Math.max(0, batch.retry_gap.dropped_notifications - (same ? this.gapNotices : 0)),
52
+ known_missing_occurrences: obsolete
53
+ ? 0
54
+ : Math.max(0, batch.retry_gap.known_missing_occurrences - (same ? this.gapOccurrences : 0)),
55
+ }
56
+ : undefined,
57
+ };
58
+ }
59
+ admit(batch) {
60
+ const pendingID = batch.pending_id ?? "legacy";
61
+ if (this.pendingID !== pendingID) {
62
+ this.pendingID = pendingID;
63
+ this.version = undefined;
64
+ this.ends = { stdout: 0, stderr: 0, pty: 0, output: 0 };
65
+ this.dropped = 0;
66
+ this.skipped = 0;
67
+ this.gapNotices = 0;
68
+ this.gapOccurrences = 0;
69
+ }
70
+ if (!batch.snapshot &&
71
+ batch.version !== undefined &&
72
+ this.version !== undefined &&
73
+ batch.version <= this.version)
74
+ return;
75
+ for (const line of batch.lines) {
76
+ if (knownStream(line.stream)) {
77
+ const end = line.offset + line.count * Math.max(1, line.end_offset - line.offset);
78
+ this.ends[line.stream] = Math.max(this.ends[line.stream], end);
79
+ }
80
+ }
81
+ this.dropped = batch.snapshot
82
+ ? Math.max(this.dropped, batch.dropped_lines)
83
+ : this.dropped + batch.dropped_lines;
84
+ this.skipped = batch.snapshot
85
+ ? Math.max(this.skipped, batch.skipped_long_lines)
86
+ : this.skipped + batch.skipped_long_lines;
87
+ this.gapNotices = Math.max(this.gapNotices, batch.retry_gap?.dropped_notifications ?? 0);
88
+ this.gapOccurrences = Math.max(this.gapOccurrences, batch.retry_gap?.known_missing_occurrences ?? 0);
89
+ if (batch.version !== undefined)
90
+ this.version = Math.max(this.version ?? batch.version, batch.version);
91
+ }
92
+ }
93
+ export function watchBatchHasContent(batch) {
94
+ return (batch.lines.length > 0 ||
95
+ batch.dropped_lines > 0 ||
96
+ batch.skipped_long_lines > 0 ||
97
+ (batch.retry_gap?.dropped_notifications ?? 0) > 0);
98
+ }
99
+ /** Watermarks survive failed acknowledgements, but clear on a confirmed ack or absence from the pending list. */
100
+ export class WatchBatchAdmissions {
101
+ watches = new Map();
102
+ key(match) {
103
+ return JSON.stringify([match.task_id, match.watch_id]);
104
+ }
105
+ unseen(matches) {
106
+ const visible = [];
107
+ for (const match of matches) {
108
+ if (!match.batch) {
109
+ visible.push(match);
110
+ continue;
111
+ }
112
+ const progress = this.watches.get(this.key(match)) ?? new WatchBatchProgress();
113
+ const batch = progress.unseen({ ...match.batch, version: match.match_offset });
114
+ if (watchBatchHasContent(batch))
115
+ visible.push({ ...match, batch });
116
+ }
117
+ return visible;
118
+ }
119
+ admit(matches) {
120
+ for (const match of matches) {
121
+ if (!match.batch)
122
+ continue;
123
+ const key = this.key(match);
124
+ const progress = this.watches.get(key) ?? new WatchBatchProgress();
125
+ progress.admit({ ...match.batch, version: match.match_offset });
126
+ this.watches.set(key, progress);
127
+ }
128
+ }
129
+ confirmed(targets) {
130
+ for (const target of targets) {
131
+ if ("watch_id" in target) {
132
+ const key = this.key(target);
133
+ if (this.watches.get(key)?.admittedVersion === target.match_offset)
134
+ this.watches.delete(key);
135
+ }
136
+ else {
137
+ for (const key of this.watches.keys()) {
138
+ if (JSON.parse(key)[0] === target.task_id)
139
+ this.watches.delete(key);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ reconcile(pending) {
145
+ const present = new Set(pending.map((match) => this.key(match)));
146
+ for (const key of this.watches.keys())
147
+ if (!present.has(key))
148
+ this.watches.delete(key);
149
+ }
150
+ get size() {
151
+ return this.watches.size;
152
+ }
153
+ }
154
+ //# sourceMappingURL=bash-watch-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash-watch-progress.js","sourceRoot":"","sources":["../src/bash-watch-progress.ts"],"names":[],"mappings":"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"}