@cortexkit/aft-pi 0.19.6 → 0.20.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.
@@ -12,9 +12,16 @@ export interface BgCompletion {
12
12
  /** True when the captured tail is shorter than the actual output. */
13
13
  output_truncated?: boolean;
14
14
  }
15
+ export interface BgLongRunningReminder {
16
+ task_id: string;
17
+ session_id: string;
18
+ command: string;
19
+ elapsed_ms: number;
20
+ }
15
21
  type SessionBgState = {
16
22
  outstandingTaskIds: Set<string>;
17
23
  pendingCompletions: BgCompletion[];
24
+ pendingLongRunning: BgLongRunningReminder[];
18
25
  debounceTimer: NodeJS.Timeout | null;
19
26
  wakeFiredThisIdle: boolean;
20
27
  firstCompletionAt: number | null;
@@ -56,12 +63,16 @@ export declare function ingestBgCompletions(sessionID: string | undefined, compl
56
63
  export declare function handlePushedBgCompletion(drainContext: DrainContext & {
57
64
  runtime: SendUserMessageRuntime;
58
65
  }, completion: unknown): Promise<void>;
66
+ export declare function handlePushedBgLongRunning(drainContext: DrainContext & {
67
+ runtime: SendUserMessageRuntime;
68
+ }, reminder: BgLongRunningReminder): Promise<void>;
59
69
  export declare function appendToolResultBgCompletions(drainContext: DrainContext, content: ContentBlock[]): Promise<ContentBlock[] | undefined>;
60
70
  export declare function handleTurnEndBgCompletions(drainContext: DrainContext & {
61
71
  runtime: SendUserMessageRuntime;
62
72
  }): Promise<void>;
63
73
  export declare function resetBgWake(sessionID: string | undefined): void;
64
74
  export declare function formatSystemReminder(completions: readonly BgCompletion[]): string;
75
+ export declare function formatLongRunningReminder(reminders: readonly BgLongRunningReminder[]): string;
65
76
  export declare function __resetBgNotificationStateForTests(): void;
66
77
  export declare function cleanupIdleSessionStates(now?: number): void;
67
78
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"bg-notifications.d.ts","sourceRoot":"","sources":["../src/bg-notifications.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bg-notifications.d.ts","sourceRoot":"","sources":["../src/bg-notifications.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -33,6 +33,8 @@ export interface ExperimentalConfig {
33
33
  rewrite?: boolean;
34
34
  compress?: boolean;
35
35
  background?: boolean;
36
+ long_running_reminder_enabled?: boolean;
37
+ long_running_reminder_interval_ms?: number;
36
38
  };
37
39
  lsp_ty?: boolean;
38
40
  }
@@ -45,6 +47,8 @@ export interface ConfigureExperimentalOverrides {
45
47
  experimental_bash_rewrite?: boolean;
46
48
  experimental_bash_compress?: boolean;
47
49
  experimental_bash_background?: boolean;
50
+ bash_long_running_reminder_enabled?: boolean;
51
+ bash_long_running_reminder_interval_ms?: number;
48
52
  experimental_lsp_ty?: boolean;
49
53
  }
50
54
  export type ToolSurface = "minimal" | "recommended" | "all";
@@ -123,6 +127,8 @@ export declare const AftConfigSchema: z.ZodObject<{
123
127
  rewrite: z.ZodOptional<z.ZodBoolean>;
124
128
  compress: z.ZodOptional<z.ZodBoolean>;
125
129
  background: z.ZodOptional<z.ZodBoolean>;
130
+ long_running_reminder_enabled: z.ZodOptional<z.ZodBoolean>;
131
+ long_running_reminder_interval_ms: z.ZodOptional<z.ZodNumber>;
126
132
  }, z.core.$strip>>;
127
133
  lsp_ty: z.ZodOptional<z.ZodBoolean>;
128
134
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAQlE,OAAO,EACL,aAAa,EAGd,MAAM,aAAa,CAAC;AAoFrB,iBAAe,iCAAiC,CAAC,OAAO,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhB;AAQD;;;;;;;;GAQG;AACH,iBAAS,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAiEA;AAED;;;;GAIG;AACH,yBAA+B,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4X9D;AAED,eAAO,MAAM,QAAQ;;;CAA4D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AASlE,OAAO,EACL,aAAa,EAGd,MAAM,aAAa,CAAC;AA+FrB,iBAAe,iCAAiC,CAAC,OAAO,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhB;AAQD;;;;;;;;GAQG;AACH,iBAAS,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAiEA;AAED;;;;GAIG;AACH,yBAA+B,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuY9D;AAED,eAAO,MAAM,QAAQ;;;CAA4D,CAAC"}
package/dist/index.js CHANGED
@@ -30612,6 +30612,7 @@ class BinaryBridge {
30612
30612
  onVersionMismatch;
30613
30613
  onConfigureWarnings;
30614
30614
  onBashCompletion;
30615
+ onBashLongRunning;
30615
30616
  configureWarningClients = new Map;
30616
30617
  restartResetTimer = null;
30617
30618
  errorPrefix;
@@ -30625,6 +30626,7 @@ class BinaryBridge {
30625
30626
  this.onVersionMismatch = options?.onVersionMismatch;
30626
30627
  this.onConfigureWarnings = options?.onConfigureWarnings;
30627
30628
  this.onBashCompletion = options?.onBashCompletion;
30629
+ this.onBashLongRunning = options?.onBashLongRunning;
30628
30630
  this.errorPrefix = options?.errorPrefix ?? "[aft-bridge]";
30629
30631
  }
30630
30632
  get restartCount() {
@@ -30937,6 +30939,10 @@ class BinaryBridge {
30937
30939
  this.onBashCompletion?.(response, this);
30938
30940
  continue;
30939
30941
  }
30942
+ if (response.type === "bash_long_running") {
30943
+ this.onBashLongRunning?.(response, this);
30944
+ continue;
30945
+ }
30940
30946
  if (response.type === "configure_warnings") {
30941
30947
  this.handleConfigureWarningsFrame(response).catch((err) => {
30942
30948
  warn(`configure warning delivery failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -31758,7 +31764,8 @@ class BridgePool {
31758
31764
  minVersion: options.minVersion,
31759
31765
  onVersionMismatch: options.onVersionMismatch,
31760
31766
  onConfigureWarnings: options.onConfigureWarnings,
31761
- onBashCompletion: options.onBashCompletion
31767
+ onBashCompletion: options.onBashCompletion,
31768
+ onBashLongRunning: options.onBashLongRunning
31762
31769
  };
31763
31770
  this.configOverrides = configOverrides;
31764
31771
  if (Number.isFinite(this.idleTimeoutMs)) {
@@ -32593,17 +32600,22 @@ async function handlePushedBgCompletion(drainContext, completion) {
32593
32600
  ingestBgCompletions(drainContext.sessionID, [completion]);
32594
32601
  await triggerWakeIfPending(drainContext, true);
32595
32602
  }
32603
+ async function handlePushedBgLongRunning(drainContext, reminder) {
32604
+ stateFor(drainContext.sessionID).pendingLongRunning.push(reminder);
32605
+ await triggerWakeIfPending(drainContext, true);
32606
+ }
32596
32607
  async function appendToolResultBgCompletions(drainContext, content) {
32597
32608
  const state = stateFor(drainContext.sessionID);
32598
- if (state.outstandingTaskIds.size === 0 && state.pendingCompletions.length === 0)
32609
+ if (state.outstandingTaskIds.size === 0 && state.pendingCompletions.length === 0 && state.pendingLongRunning.length === 0)
32599
32610
  return;
32600
32611
  if (state.outstandingTaskIds.size > 0) {
32601
32612
  await drainCompletions(drainContext);
32602
32613
  }
32603
- if (state.pendingCompletions.length === 0)
32614
+ if (state.pendingCompletions.length === 0 && state.pendingLongRunning.length === 0)
32604
32615
  return;
32605
- const reminder = formatSystemReminder(state.pendingCompletions);
32616
+ const reminder = formatCombinedSystemReminder(state.pendingCompletions, state.pendingLongRunning);
32606
32617
  state.pendingCompletions = [];
32618
+ state.pendingLongRunning = [];
32607
32619
  return [...content, { type: "text", text: reminder }];
32608
32620
  }
32609
32621
  async function handleTurnEndBgCompletions(drainContext) {
@@ -32618,7 +32630,7 @@ async function triggerWakeIfPending(drainContext, skipDrain) {
32618
32630
  if (!skipDrain && state.outstandingTaskIds.size > 0) {
32619
32631
  await drainCompletions(drainContext);
32620
32632
  }
32621
- if (state.pendingCompletions.length === 0)
32633
+ if (state.pendingCompletions.length === 0 && state.pendingLongRunning.length === 0)
32622
32634
  return;
32623
32635
  scheduleWake(state, async (reminder) => {
32624
32636
  drainContext.runtime.sendUserMessage(reminder, { deliverAs: "steer" });
@@ -32641,6 +32653,23 @@ For truncated tasks, use bash_status({ task_id: "..." }) to retrieve full output
32641
32653
  ${bullets}${tail}
32642
32654
  </system-reminder>`;
32643
32655
  }
32656
+ function formatLongRunningReminder(reminders) {
32657
+ const bullets = reminders.map((reminder) => `- ${reminder.task_id} still running after ${formatDurationMs(reminder.elapsed_ms)}: ${shorten(reminder.command, 120)}`).join(`
32658
+ `);
32659
+ return `<system-reminder>
32660
+ [BACKGROUND BASH STILL RUNNING]
32661
+ ${bullets}
32662
+ Use bash_status({ task_id: "..." }) to inspect output or bash_kill({ task_id: "..." }) to terminate.
32663
+ </system-reminder>`;
32664
+ }
32665
+ function formatCombinedSystemReminder(completions, longRunning) {
32666
+ if (completions.length === 0)
32667
+ return formatLongRunningReminder(longRunning);
32668
+ if (longRunning.length === 0)
32669
+ return formatSystemReminder(completions);
32670
+ return `${formatSystemReminder(completions)}
32671
+ ${formatLongRunningReminder(longRunning)}`;
32672
+ }
32644
32673
  async function drainCompletions({ ctx, directory, sessionID }) {
32645
32674
  try {
32646
32675
  const bridge = ctx.pool.getActiveBridgeForRoot(directory) ?? ctx.pool.getBridge(directory);
@@ -32658,7 +32687,8 @@ async function drainCompletions({ ctx, directory, sessionID }) {
32658
32687
  }
32659
32688
  function scheduleWake(state, sendWake, onSendFailure) {
32660
32689
  const now = Date.now();
32661
- if (state.debounceTimer && state.pendingCompletions.length <= state.scheduledCompletionCount) {
32690
+ const pendingCount = state.pendingCompletions.length + state.pendingLongRunning.length;
32691
+ if (state.debounceTimer && pendingCount <= state.scheduledCompletionCount) {
32662
32692
  return;
32663
32693
  }
32664
32694
  if (state.firstCompletionAt === null) {
@@ -32668,14 +32698,16 @@ function scheduleWake(state, sendWake, onSendFailure) {
32668
32698
  const previousFireAt = state.scheduledFireAt ?? now;
32669
32699
  state.scheduledFireAt = Math.min(previousFireAt + DEBOUNCE_STEP_MS, state.firstCompletionAt + DEBOUNCE_CAP_MS);
32670
32700
  }
32671
- state.scheduledCompletionCount = state.pendingCompletions.length;
32701
+ state.scheduledCompletionCount = pendingCount;
32672
32702
  if (state.debounceTimer)
32673
32703
  clearTimeout(state.debounceTimer);
32674
32704
  const delay = state.retryDelayMs ?? Math.max(0, (state.scheduledFireAt ?? now) - now);
32675
32705
  state.debounceTimer = setTimeout(() => {
32676
32706
  const pending = state.pendingCompletions;
32677
- const reminder = formatSystemReminder(pending);
32707
+ const pendingLongRunning = state.pendingLongRunning;
32708
+ const reminder = formatCombinedSystemReminder(pending, pendingLongRunning);
32678
32709
  state.pendingCompletions = [];
32710
+ state.pendingLongRunning = [];
32679
32711
  state.debounceTimer = null;
32680
32712
  state.firstCompletionAt = null;
32681
32713
  state.scheduledFireAt = null;
@@ -32685,6 +32717,7 @@ function scheduleWake(state, sendWake, onSendFailure) {
32685
32717
  state.wakeFiredThisIdle = true;
32686
32718
  }).catch((err) => {
32687
32719
  state.pendingCompletions = [...pending, ...state.pendingCompletions];
32720
+ state.pendingLongRunning = [...pendingLongRunning, ...state.pendingLongRunning];
32688
32721
  state.retryDelayMs = Math.min((delay || DEBOUNCE_STEP_MS) * 2, DEBOUNCE_CAP_MS);
32689
32722
  onSendFailure(err);
32690
32723
  scheduleWake(state, sendWake, onSendFailure);
@@ -32701,6 +32734,7 @@ function stateFor(sessionID) {
32701
32734
  state = {
32702
32735
  outstandingTaskIds: new Set,
32703
32736
  pendingCompletions: [],
32737
+ pendingLongRunning: [],
32704
32738
  debounceTimer: null,
32705
32739
  wakeFiredThisIdle: false,
32706
32740
  firstCompletionAt: null,
@@ -32787,6 +32821,17 @@ function formatDuration(completion) {
32787
32821
  const seconds = totalSeconds % 60;
32788
32822
  return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
32789
32823
  }
32824
+ function formatDurationMs(ms) {
32825
+ if (!Number.isFinite(ms) || ms < 1000)
32826
+ return `${Math.max(0, Math.round(ms))}ms`;
32827
+ const totalSeconds = Math.round(ms / 1000);
32828
+ const minutes = Math.floor(totalSeconds / 60);
32829
+ const seconds = totalSeconds % 60;
32830
+ return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
32831
+ }
32832
+ function shorten(value, limit) {
32833
+ return value.length <= limit ? value : `${value.slice(0, limit - 1)}…`;
32834
+ }
32790
32835
 
32791
32836
  // src/shared/status.ts
32792
32837
  function asRecord(value) {
@@ -46594,7 +46639,9 @@ var ExperimentalConfigSchema = exports_external.object({
46594
46639
  bash: exports_external.object({
46595
46640
  rewrite: exports_external.boolean().optional(),
46596
46641
  compress: exports_external.boolean().optional(),
46597
- background: exports_external.boolean().optional()
46642
+ background: exports_external.boolean().optional(),
46643
+ long_running_reminder_enabled: exports_external.boolean().optional(),
46644
+ long_running_reminder_interval_ms: exports_external.number().int().positive().optional()
46598
46645
  }).optional(),
46599
46646
  lsp_ty: exports_external.boolean().optional()
46600
46647
  });
@@ -46673,6 +46720,12 @@ function resolveExperimentalConfigForConfigure(config2) {
46673
46720
  if (config2.experimental?.bash?.background !== undefined) {
46674
46721
  overrides.experimental_bash_background = config2.experimental.bash.background;
46675
46722
  }
46723
+ if (config2.experimental?.bash?.long_running_reminder_enabled !== undefined) {
46724
+ overrides.bash_long_running_reminder_enabled = config2.experimental.bash.long_running_reminder_enabled;
46725
+ }
46726
+ if (config2.experimental?.bash?.long_running_reminder_interval_ms !== undefined) {
46727
+ overrides.bash_long_running_reminder_interval_ms = config2.experimental.bash.long_running_reminder_interval_ms;
46728
+ }
46676
46729
  if (config2.experimental?.lsp_ty !== undefined) {
46677
46730
  overrides.experimental_lsp_ty = config2.experimental.lsp_ty;
46678
46731
  }
@@ -48966,14 +49019,16 @@ function registerAstTools(pi, ctx, surface) {
48966
49019
  // src/tools/bash.ts
48967
49020
  import { Container as Container2, Spacer as Spacer2, Text as Text2 } from "@mariozechner/pi-tui";
48968
49021
  import { Type as Type2 } from "@sinclair/typebox";
48969
- var DEFAULT_BASH_TIMEOUT_MS = 30000;
48970
- var BASH_TRANSPORT_TIMEOUT_OVERHEAD_MS = 5000;
49022
+ var FOREGROUND_WAIT_WINDOW_MS = 5000;
49023
+ var FOREGROUND_POLL_INTERVAL_MS = 100;
49024
+ var BASH_TRANSPORT_TIMEOUT_MS = 30000;
48971
49025
  var BashParams = Type2.Object({
48972
49026
  command: Type2.String({
48973
49027
  description: "Shell command to execute. Supports pipes, redirections, and shell syntax."
48974
49028
  }),
48975
- timeout: Type2.Optional(Type2.Number({
48976
- description: "Maximum execution time in milliseconds. Default: 30000 (30 seconds). Commands exceeding this are terminated with SIGKILL. For commands expected to run longer than 30s, use background: true instead."
49029
+ timeout: Type2.Optional(Type2.Integer({
49030
+ minimum: 1,
49031
+ description: "Hard kill cap in milliseconds (positive integer). When omitted, the task can run up to 30 minutes. Foreground bash returns inline if the command finishes within ~5s; otherwise it's automatically promoted to background and a completion reminder is delivered when the task actually finishes."
48977
49032
  })),
48978
49033
  workdir: Type2.Optional(Type2.String({
48979
49034
  description: "Working directory for command execution. Relative paths resolve against the project root. Defaults to the current session's working directory."
@@ -49023,7 +49078,6 @@ function registerBashTool(pi, ctx) {
49023
49078
  promptSnippet: "Run shell commands (timeout in milliseconds; supports workdir, background tasks, compressed output)",
49024
49079
  promptGuidelines: [
49025
49080
  "Use bash only when a dedicated AFT tool is not a better fit.",
49026
- "Prefer background: true for commands that may take longer than 30 seconds.",
49027
49081
  "Set compressed: false when you need ANSI color codes in the output."
49028
49082
  ],
49029
49083
  parameters: BashParams,
@@ -49048,9 +49102,10 @@ function registerBashTool(pi, ctx) {
49048
49102
  env: spawnContext.env,
49049
49103
  description: params.description,
49050
49104
  background: params.background,
49105
+ notify_on_completion: params.background === true,
49051
49106
  compressed: params.compressed
49052
49107
  }, extCtx, {
49053
- transportTimeoutMs: bashTransportTimeoutMs(params.timeout),
49108
+ transportTimeoutMs: BASH_TRANSPORT_TIMEOUT_MS,
49054
49109
  keepBridgeOnTimeout: true,
49055
49110
  onProgress: ({ text }) => {
49056
49111
  streamed += text;
@@ -49068,7 +49123,38 @@ function registerBashTool(pi, ctx) {
49068
49123
  }
49069
49124
  const taskId = response.task_id;
49070
49125
  if (response.status === "running" && taskId) {
49071
- trackBgTask(resolveSessionId(extCtx), taskId);
49126
+ if (params.background === true) {
49127
+ trackBgTask(resolveSessionId(extCtx), taskId);
49128
+ return bashResult(formatBackgroundLaunch(taskId), { task_id: taskId });
49129
+ }
49130
+ const waitTimeoutMs = params.timeout !== undefined ? Math.min(params.timeout, FOREGROUND_WAIT_WINDOW_MS) : FOREGROUND_WAIT_WINDOW_MS;
49131
+ const startedAt = Date.now();
49132
+ while (true) {
49133
+ const status = await callBridge(bridge, "bash_status", { task_id: taskId }, extCtx);
49134
+ if (status.success === false) {
49135
+ throw new Error(status.message ?? "bash_status failed");
49136
+ }
49137
+ if (isTerminalStatus(status.status)) {
49138
+ return bashResult(formatForegroundResult(status), {
49139
+ exit_code: status.exit_code,
49140
+ duration_ms: status.duration_ms,
49141
+ truncated: status.output_truncated,
49142
+ output_path: status.output_path,
49143
+ task_id: taskId
49144
+ });
49145
+ }
49146
+ if (Date.now() - startedAt >= waitTimeoutMs) {
49147
+ const promoted = await callBridge(bridge, "bash_promote", { task_id: taskId }, extCtx);
49148
+ if (promoted.success === false) {
49149
+ throw new Error(promoted.message ?? "bash_promote failed");
49150
+ }
49151
+ trackBgTask(resolveSessionId(extCtx), taskId);
49152
+ return bashResult(formatPromotionMessage(taskId, params.timeout), {
49153
+ task_id: taskId
49154
+ });
49155
+ }
49156
+ await sleep(FOREGROUND_POLL_INTERVAL_MS);
49157
+ }
49072
49158
  }
49073
49159
  const details = {
49074
49160
  exit_code: response.exit_code,
@@ -49077,10 +49163,6 @@ function registerBashTool(pi, ctx) {
49077
49163
  output_path: response.output_path,
49078
49164
  task_id: taskId
49079
49165
  };
49080
- if (response.status === "running" && taskId) {
49081
- const startedLine = `Background task started: ${taskId}. A completion reminder will be delivered automatically; don't poll bash_status.`;
49082
- return bashResult(startedLine, details);
49083
- }
49084
49166
  const output = response.output ?? "";
49085
49167
  return bashResult(output, details);
49086
49168
  },
@@ -49091,14 +49173,39 @@ function registerBashTool(pi, ctx) {
49091
49173
  return renderBashResult(result, theme, context);
49092
49174
  }
49093
49175
  });
49094
- if (ctx.config.experimental?.bash?.background === true) {
49095
- pi.registerTool(createBashStatusTool(ctx));
49096
- pi.registerTool(createBashKillTool(ctx));
49176
+ pi.registerTool(createBashStatusTool(ctx));
49177
+ pi.registerTool(createBashKillTool(ctx));
49178
+ }
49179
+ function formatBackgroundLaunch(taskId) {
49180
+ return `Background task started: ${taskId}. A completion reminder will be delivered automatically; don't poll bash_status.`;
49181
+ }
49182
+ function formatPromotionMessage(taskId, timeout) {
49183
+ const waited = timeout !== undefined ? Math.min(timeout, FOREGROUND_WAIT_WINDOW_MS) : FOREGROUND_WAIT_WINDOW_MS;
49184
+ return `Foreground bash didn't finish within ${waited}ms and was promoted to background: ${taskId}. A completion reminder will be delivered automatically; use bash_status({ task_id: "${taskId}" }) to inspect output or bash_kill({ task_id: "${taskId}" }) to terminate.`;
49185
+ }
49186
+ function formatForegroundResult(data) {
49187
+ const output = data.output_preview ?? "";
49188
+ const outputPath = data.output_path;
49189
+ const truncated = data.output_truncated === true;
49190
+ const status = data.status;
49191
+ const exit = data.exit_code;
49192
+ let rendered = output;
49193
+ if (truncated && outputPath) {
49194
+ rendered += `
49195
+ [output truncated; full output at ${outputPath}]`;
49097
49196
  }
49197
+ if (status === "timed_out") {
49198
+ rendered += `
49199
+ [command timed out]`;
49200
+ }
49201
+ if (typeof exit === "number" && exit !== 0) {
49202
+ rendered += `
49203
+ [exit code: ${exit}]`;
49204
+ }
49205
+ return rendered;
49098
49206
  }
49099
- function bashTransportTimeoutMs(timeout) {
49100
- const bashTimeout = timeout ?? DEFAULT_BASH_TIMEOUT_MS;
49101
- return Math.max(30000, bashTimeout + BASH_TRANSPORT_TIMEOUT_OVERHEAD_MS);
49207
+ function sleep(ms) {
49208
+ return new Promise((resolve3) => setTimeout(resolve3, ms));
49102
49209
  }
49103
49210
  function createBashStatusTool(ctx) {
49104
49211
  return {
@@ -49176,7 +49283,7 @@ A completion reminder will be delivered automatically; don't poll.`;
49176
49283
  return text;
49177
49284
  }
49178
49285
  function isTerminalStatus(status) {
49179
- return status !== "running";
49286
+ return status === "completed" || status === "failed" || status === "killed" || status === "timed_out";
49180
49287
  }
49181
49288
  function renderBashCall(command, description, theme, context) {
49182
49289
  const text = reuseText2(context.lastComponent);
@@ -49840,7 +49947,34 @@ async function resolvePathArg(cwd, path2) {
49840
49947
  }
49841
49948
  }
49842
49949
  function splitIncludeGlobs(include) {
49843
- return include.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
49950
+ const out = [];
49951
+ let depth = 0;
49952
+ let buf = "";
49953
+ for (const ch of include) {
49954
+ if (ch === "{") {
49955
+ depth++;
49956
+ buf += ch;
49957
+ continue;
49958
+ }
49959
+ if (ch === "}") {
49960
+ if (depth > 0)
49961
+ depth--;
49962
+ buf += ch;
49963
+ continue;
49964
+ }
49965
+ if (ch === "," && depth === 0) {
49966
+ const trimmed = buf.trim();
49967
+ if (trimmed.length > 0)
49968
+ out.push(trimmed);
49969
+ buf = "";
49970
+ continue;
49971
+ }
49972
+ buf += ch;
49973
+ }
49974
+ const tail = buf.trim();
49975
+ if (tail.length > 0)
49976
+ out.push(tail);
49977
+ return out;
49844
49978
  }
49845
49979
  function formatReadFooter(agentSpecifiedRange, data) {
49846
49980
  if (agentSpecifiedRange)
@@ -51260,7 +51394,7 @@ ${lines}
51260
51394
  } catch (err) {
51261
51395
  warn2(`[lsp] auto-install setup failed: ${err instanceof Error ? err.message : String(err)}`);
51262
51396
  }
51263
- const pool = new BridgePool(binaryPath, {
51397
+ const poolOptions = {
51264
51398
  errorPrefix: "[aft-pi]",
51265
51399
  minVersion: PLUGIN_VERSION,
51266
51400
  onConfigureWarnings: async ({ projectRoot, sessionId, client, warnings }) => {
@@ -51281,8 +51415,18 @@ ${lines}
51281
51415
  runtime: pi,
51282
51416
  isActive: () => bridge.hasPendingRequests()
51283
51417
  }, completion);
51418
+ },
51419
+ onBashLongRunning: (reminder, bridge) => {
51420
+ handlePushedBgLongRunning({
51421
+ ctx,
51422
+ directory: process.cwd(),
51423
+ sessionID: reminder.session_id,
51424
+ runtime: pi,
51425
+ isActive: () => bridge.hasPendingRequests()
51426
+ }, reminder);
51284
51427
  }
51285
- }, configOverrides);
51428
+ };
51429
+ const pool = new BridgePool(binaryPath, poolOptions, configOverrides);
51286
51430
  const ctx = { pool, config: config2, storageDir };
51287
51431
  if (onnxRuntimePromise) {
51288
51432
  onnxRuntimePromise.then((ortDylibDir) => {
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2DjD,QAAA,MAAM,cAAc;;EAIlB,CAAC;AAWH,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsCD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA+H3E;AAOD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa;;;;;;;;yBASpC,MAAM,UACX,MAAM,CAAC,OAAO,cAAc,CAAC,WAC5B,WAAW,GAAG,SAAS,aACrB,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,UACrE,gBAAgB;EAW7B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa;;;;;;;;yBASlC,MAAM,UACX,MAAM,CAAC,OAAO,cAAc,CAAC,WAC5B,WAAW,GAAG,SAAS,aACrB,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,UACnE,gBAAgB;EAW7B"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqEjD,QAAA,MAAM,cAAc;;EAIlB,CAAC;AAWH,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsCD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA0J3E;AAwCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa;;;;;;;;yBASpC,MAAM,UACX,MAAM,CAAC,OAAO,cAAc,CAAC,WAC5B,WAAW,GAAG,SAAS,aACrB,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,UACrE,gBAAgB;EAW7B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa;;;;;;;;yBASlC,MAAM,UACX,MAAM,CAAC,OAAO,cAAc,CAAC,WAC5B,WAAW,GAAG,SAAS,aACrB,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,UACnE,gBAAgB;EAW7B"}
@@ -63,6 +63,19 @@ export declare function registerHoistedTools(pi: ExtensionAPI, ctx: PluginContex
63
63
  * behavior without spinning up a real bridge.
64
64
  */
65
65
  export declare function buildMutationResult(filePath: string, response: Record<string, unknown>): AgentToolResult<FileMutationDetails>;
66
+ /**
67
+ * Brace-aware split for OpenCode-style include args.
68
+ *
69
+ * Accepts:
70
+ * - "*.ts,*.tsx" (comma-separated includes)
71
+ * - "**\/*.{vue,ts,tsx}" (single glob with brace alternation)
72
+ * - "*.ts,**\/*.{vue,tsx}" (mix of both)
73
+ *
74
+ * A naive split-by-`,` would chop `*.{vue,ts}` into `*.{vue` + `ts}`,
75
+ * which then fails downstream globbing with
76
+ * `unclosed alternate group; missing '}'`.
77
+ */
78
+ export declare function splitIncludeGlobs(include: string): string[];
66
79
  /**
67
80
  * Build the navigation footer for a `read` response. Mirrors the OpenCode
68
81
  * plugin's helper of the same name. See packages/opencode-plugin/src/tools/
@@ -1 +1 @@
1
- {"version":3,"file":"hoisted.d.ts","sourceRoot":"","sources":["../../src/tools/hoisted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,YAAY,EAGlB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2DjD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,kEAAkE;AAClE,UAAU,mBAAmB;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAmLN;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,eAAe,CAAC,mBAAmB,CAAC,CAiFtC;AAwJD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,mBAAmB,EAAE,OAAO,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAgBR"}
1
+ {"version":3,"file":"hoisted.d.ts","sourceRoot":"","sources":["../../src/tools/hoisted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,YAAY,EAGlB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2DjD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,kEAAkE;AAClE,UAAU,mBAAmB;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAmLN;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,eAAe,CAAC,mBAAmB,CAAC,CAiFtC;AAgJD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B3D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,mBAAmB,EAAE,OAAO,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAgBR"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/aft-pi",
3
- "version": "0.19.6",
3
+ "version": "0.20.0",
4
4
  "type": "module",
5
5
  "description": "Pi coding agent extension for Agent File Tools (AFT) — tree-sitter and LSP-powered code analysis",
6
6
  "main": "dist/index.js",
@@ -22,18 +22,18 @@
22
22
  "prepublishOnly": "bun run build"
23
23
  },
24
24
  "dependencies": {
25
- "@cortexkit/aft-bridge": "0.19.6",
25
+ "@cortexkit/aft-bridge": "0.20.0",
26
26
  "@sinclair/typebox": "^0.34.33",
27
27
  "comment-json": "^5.0.0",
28
28
  "diff": "^8.0.4",
29
29
  "zod": "^4.1.8"
30
30
  },
31
31
  "optionalDependencies": {
32
- "@cortexkit/aft-darwin-arm64": "0.19.6",
33
- "@cortexkit/aft-darwin-x64": "0.19.6",
34
- "@cortexkit/aft-linux-arm64": "0.19.6",
35
- "@cortexkit/aft-linux-x64": "0.19.6",
36
- "@cortexkit/aft-win32-x64": "0.19.6"
32
+ "@cortexkit/aft-darwin-arm64": "0.20.0",
33
+ "@cortexkit/aft-darwin-x64": "0.20.0",
34
+ "@cortexkit/aft-linux-arm64": "0.20.0",
35
+ "@cortexkit/aft-linux-x64": "0.20.0",
36
+ "@cortexkit/aft-win32-x64": "0.20.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@mariozechner/pi-coding-agent": "*",