@cortexkit/aft-pi 0.27.0 → 0.28.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.
package/dist/config.d.ts CHANGED
@@ -52,7 +52,32 @@ export interface ConfigureExperimentalOverrides {
52
52
  experimental_lsp_ty?: boolean;
53
53
  }
54
54
  export type ToolSurface = "minimal" | "recommended" | "all";
55
+ /**
56
+ * Graduated `bash` config. Replaces `experimental.bash.*` in v0.27.2.
57
+ *
58
+ * Mirrors the OpenCode plugin's `AftConfig.bash` shape exactly so projects
59
+ * using both harnesses get identical resolution semantics. See
60
+ * `resolveBashConfig` below for precedence rules.
61
+ *
62
+ * Three shapes:
63
+ * - `bash: true` → all sub-features on
64
+ * - `bash: false` → hoist disabled entirely; Pi's native bash stays
65
+ * - `bash: { ... }` → partial override; missing sub-keys default to true
66
+ */
67
+ export interface BashConfig {
68
+ rewrite?: boolean;
69
+ compress?: boolean;
70
+ background?: boolean;
71
+ long_running_reminder_enabled?: boolean;
72
+ long_running_reminder_interval_ms?: number;
73
+ }
55
74
  export interface AftConfig {
75
+ /**
76
+ * Optional JSON Schema URL for editor tooling. Runtime no-op — only present
77
+ * so VS Code/Cursor/etc. pick up the published schema for autocomplete +
78
+ * validation. `aft setup` auto-inserts this.
79
+ */
80
+ $schema?: string;
56
81
  format_on_edit?: boolean;
57
82
  /** Maximum formatter subprocess wallclock seconds. Bounded 1..=600. Default 10. */
58
83
  formatter_timeout_secs?: number;
@@ -64,6 +89,18 @@ export interface AftConfig {
64
89
  restrict_to_project_root?: boolean;
65
90
  search_index?: boolean;
66
91
  semantic_search?: boolean;
92
+ /**
93
+ * Bash tool family (hoist + rewrite + compress + background execution).
94
+ * Default on for `tool_surface: recommended`/`all`, off for `minimal`.
95
+ * Graduated from `experimental.bash.*` in v0.27.2; the legacy nested
96
+ * form is still accepted for backward compat.
97
+ *
98
+ * - `true` — all sub-features on, hoist enabled
99
+ * - `false` — hoist disabled entirely; Pi's native bash stays
100
+ * - `{ rewrite?, compress?, background?, ... }` — partial override;
101
+ * missing sub-keys default to `true`
102
+ */
103
+ bash?: boolean | BashConfig;
67
104
  experimental?: ExperimentalConfig;
68
105
  lsp?: LspConfig;
69
106
  url_fetch_allow_private?: boolean;
@@ -75,6 +112,36 @@ export interface AftConfig {
75
112
  */
76
113
  max_callgraph_files?: number;
77
114
  }
115
+ /**
116
+ * Resolved bash config: every flag has an explicit boolean.
117
+ */
118
+ export interface ResolvedBashConfig {
119
+ enabled: boolean;
120
+ rewrite: boolean;
121
+ compress: boolean;
122
+ background: boolean;
123
+ long_running_reminder_enabled?: boolean;
124
+ long_running_reminder_interval_ms?: number;
125
+ }
126
+ /**
127
+ * Single source of truth for bash config across the Pi plugin. Resolution
128
+ * order (highest priority wins):
129
+ *
130
+ * 1. Top-level `bash: false` → fully disabled (sub-features all false)
131
+ * 2. Top-level `bash: true` → fully enabled (sub-features all true)
132
+ * 3. Top-level `bash: { ... }` → enabled; each sub-feature defaults true
133
+ * when not specified
134
+ * 4. Top-level `bash` absent + any `experimental.bash.*` set → legacy
135
+ * fallback; sub-features take their explicit values (default false
136
+ * to preserve pre-v0.27.2 behavior — that block was opt-in)
137
+ * 5. Top-level `bash` absent + no experimental → tool_surface default:
138
+ * - "minimal" → disabled
139
+ * - "recommended" or "all" → enabled with all sub-features on
140
+ *
141
+ * Mirrors OpenCode's resolver exactly. Reminder tuning rides through from
142
+ * whichever surface specified it (top-level wins, legacy fills the gap).
143
+ */
144
+ export declare function resolveBashConfig(config: AftConfig): ResolvedBashConfig;
78
145
  export declare const LspServerSchema: z.ZodObject<{
79
146
  extensions: z.ZodArray<z.ZodString>;
80
147
  binary: z.ZodString;
@@ -86,6 +153,7 @@ export declare const LspServerSchema: z.ZodObject<{
86
153
  id: z.ZodString;
87
154
  }, z.core.$strip>;
88
155
  export declare const AftConfigSchema: z.ZodObject<{
156
+ $schema: z.ZodOptional<z.ZodString>;
89
157
  format_on_edit: z.ZodOptional<z.ZodBoolean>;
90
158
  formatter_timeout_secs: z.ZodOptional<z.ZodNumber>;
91
159
  validate_on_edit: z.ZodOptional<z.ZodEnum<{
@@ -122,6 +190,13 @@ export declare const AftConfigSchema: z.ZodObject<{
122
190
  restrict_to_project_root: z.ZodOptional<z.ZodBoolean>;
123
191
  search_index: z.ZodOptional<z.ZodBoolean>;
124
192
  semantic_search: z.ZodOptional<z.ZodBoolean>;
193
+ bash: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
194
+ rewrite: z.ZodOptional<z.ZodBoolean>;
195
+ compress: z.ZodOptional<z.ZodBoolean>;
196
+ background: z.ZodOptional<z.ZodBoolean>;
197
+ long_running_reminder_enabled: z.ZodOptional<z.ZodBoolean>;
198
+ long_running_reminder_interval_ms: z.ZodOptional<z.ZodNumber>;
199
+ }, z.core.$strip>]>>;
125
200
  experimental: z.ZodOptional<z.ZodObject<{
126
201
  bash: z.ZodOptional<z.ZodObject<{
127
202
  rewrite: z.ZodOptional<z.ZodBoolean>;
@@ -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;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAQpE,OAAO,EACL,KAAK,SAAS,EACd,aAAa,EAGd,MAAM,aAAa,CAAC;AAgDrB,KAAK,mBAAmB,GAAG;IACzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,iBAAS,4BAA4B,CACnC,OAAO,EAAE,MAAM,mBAAmB,GAAG,SAAS,EAC9C,sBAAsB,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAgB,IAOrE,eAAe,MAAM,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCjF;AAkDD,iBAAS,wBAAwB,CAC/B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,GAAG,UAAU,CAAC,GACtD,OAAO,CAGT;AASD,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,MAAM,EAAE,IAAI,CAAC,OAAO,uBAAuB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACnE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB;AAED;;;;;;;;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,CAya9D;AAED,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAcH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAQpE,OAAO,EACL,KAAK,SAAS,EACd,aAAa,EAId,MAAM,aAAa,CAAC;AAgDrB,KAAK,mBAAmB,GAAG;IACzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,iBAAS,4BAA4B,CACnC,OAAO,EAAE,MAAM,mBAAmB,GAAG,SAAS,EAC9C,sBAAsB,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAgB,IAOrE,eAAe,MAAM,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCjF;AA2DD,iBAAS,wBAAwB,CAC/B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,GAAG,UAAU,CAAC,GACtD,OAAO,CAGT;AASD,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,MAAM,EAAE,IAAI,CAAC,OAAO,uBAAuB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IACnE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB;AAED;;;;;;;;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,CA0a9D;AAED,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC"}
package/dist/index.js CHANGED
@@ -31266,13 +31266,14 @@ import { pipeline } from "node:stream/promises";
31266
31266
  var PLATFORM_ARCH_MAP = {
31267
31267
  darwin: { arm64: "darwin-arm64", x64: "darwin-x64" },
31268
31268
  linux: { arm64: "linux-arm64", x64: "linux-x64" },
31269
- win32: { arm64: "win32-x64", x64: "win32-x64" }
31269
+ win32: { arm64: "win32-arm64", x64: "win32-x64" }
31270
31270
  };
31271
31271
  var PLATFORM_ASSET_MAP = {
31272
31272
  "darwin-arm64": "aft-darwin-arm64",
31273
31273
  "darwin-x64": "aft-darwin-x64",
31274
31274
  "linux-arm64": "aft-linux-arm64",
31275
31275
  "linux-x64": "aft-linux-x64",
31276
+ "win32-arm64": "aft-win32-arm64.exe",
31276
31277
  "win32-x64": "aft-win32-x64.exe"
31277
31278
  };
31278
31279
 
@@ -32359,6 +32360,7 @@ class BridgePool {
32359
32360
  idleTimeoutMs;
32360
32361
  bridgeOptions;
32361
32362
  configOverrides;
32363
+ projectConfigLoader;
32362
32364
  logger;
32363
32365
  cleanupTimer = null;
32364
32366
  constructor(binaryPath, options = {}, configOverrides = {}) {
@@ -32366,6 +32368,7 @@ class BridgePool {
32366
32368
  this.maxPoolSize = options.maxPoolSize ?? DEFAULT_MAX_POOL_SIZE;
32367
32369
  this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
32368
32370
  this.logger = options.logger;
32371
+ this.projectConfigLoader = options.projectConfigLoader;
32369
32372
  this.bridgeOptions = {
32370
32373
  timeoutMs: options.timeoutMs,
32371
32374
  maxRestarts: options.maxRestarts,
@@ -32401,7 +32404,17 @@ class BridgePool {
32401
32404
  if (this.bridges.size >= this.maxPoolSize) {
32402
32405
  this.evictLRU();
32403
32406
  }
32404
- const bridge = new BinaryBridge(this.binaryPath, key, this.bridgeOptions, this.configOverrides);
32407
+ let projectOverrides = {};
32408
+ if (this.projectConfigLoader) {
32409
+ try {
32410
+ projectOverrides = this.projectConfigLoader(key) ?? {};
32411
+ } catch (err) {
32412
+ const message = err instanceof Error ? err.message : String(err);
32413
+ this.error(`projectConfigLoader failed; using global overrides only: ${message}`);
32414
+ }
32415
+ }
32416
+ const mergedOverrides = { ...this.configOverrides, ...projectOverrides };
32417
+ const bridge = new BinaryBridge(this.binaryPath, key, this.bridgeOptions, mergedOverrides);
32405
32418
  this.bridges.set(key, { bridge, lastUsed: Date.now() });
32406
32419
  return bridge;
32407
32420
  }
@@ -33413,7 +33426,7 @@ import {
33413
33426
  // package.json
33414
33427
  var package_default = {
33415
33428
  name: "@cortexkit/aft-pi",
33416
- version: "0.27.0",
33429
+ version: "0.28.0",
33417
33430
  type: "module",
33418
33431
  description: "Pi coding agent extension for Agent File Tools (AFT) — tree-sitter and LSP-powered code analysis",
33419
33432
  main: "dist/index.js",
@@ -33435,18 +33448,19 @@ var package_default = {
33435
33448
  prepublishOnly: "bun run build"
33436
33449
  },
33437
33450
  dependencies: {
33438
- "@cortexkit/aft-bridge": "0.27.0",
33451
+ "@cortexkit/aft-bridge": "0.28.0",
33439
33452
  typebox: "^1.1.24",
33440
33453
  "comment-json": "^5.0.0",
33441
33454
  diff: "^8.0.4",
33442
33455
  zod: "^4.1.8"
33443
33456
  },
33444
33457
  optionalDependencies: {
33445
- "@cortexkit/aft-darwin-arm64": "0.27.0",
33446
- "@cortexkit/aft-darwin-x64": "0.27.0",
33447
- "@cortexkit/aft-linux-arm64": "0.27.0",
33448
- "@cortexkit/aft-linux-x64": "0.27.0",
33449
- "@cortexkit/aft-win32-x64": "0.27.0"
33458
+ "@cortexkit/aft-darwin-arm64": "0.28.0",
33459
+ "@cortexkit/aft-darwin-x64": "0.28.0",
33460
+ "@cortexkit/aft-linux-arm64": "0.28.0",
33461
+ "@cortexkit/aft-linux-x64": "0.28.0",
33462
+ "@cortexkit/aft-win32-arm64": "0.28.0",
33463
+ "@cortexkit/aft-win32-x64": "0.28.0"
33450
33464
  },
33451
33465
  devDependencies: {
33452
33466
  "@earendil-works/pi-coding-agent": "*",
@@ -33544,6 +33558,7 @@ function coerceAftStatus(response) {
33544
33558
  project_root: readNullableString(response.project_root),
33545
33559
  canonical_root: readNullableString(response.canonical_root),
33546
33560
  cache_role: readString(response.cache_role, "not_initialized"),
33561
+ message: typeof response.message === "string" ? response.message : undefined,
33547
33562
  features: {
33548
33563
  format_on_edit: readBoolean(features.format_on_edit),
33549
33564
  validate_on_edit: readString(features.validate_on_edit, "off"),
@@ -47511,6 +47526,50 @@ function date4(params) {
47511
47526
  // ../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/external.js
47512
47527
  config(en_default());
47513
47528
  // src/config.ts
47529
+ function resolveBashConfig(config2) {
47530
+ const top = config2.bash;
47531
+ const legacy = config2.experimental?.bash;
47532
+ const surface = config2.tool_surface ?? "recommended";
47533
+ const surfaceDefaultEnabled = surface !== "minimal";
47534
+ const reminderEnabled = (typeof top === "object" && top !== null ? top.long_running_reminder_enabled : undefined) ?? legacy?.long_running_reminder_enabled;
47535
+ const reminderInterval = (typeof top === "object" && top !== null ? top.long_running_reminder_interval_ms : undefined) ?? legacy?.long_running_reminder_interval_ms;
47536
+ const base = {
47537
+ enabled: false,
47538
+ rewrite: false,
47539
+ compress: false,
47540
+ background: false,
47541
+ long_running_reminder_enabled: reminderEnabled,
47542
+ long_running_reminder_interval_ms: reminderInterval
47543
+ };
47544
+ if (top === false)
47545
+ return base;
47546
+ if (top === true) {
47547
+ return { ...base, enabled: true, rewrite: true, compress: true, background: true };
47548
+ }
47549
+ if (typeof top === "object" && top !== null) {
47550
+ return {
47551
+ ...base,
47552
+ enabled: true,
47553
+ rewrite: top.rewrite ?? true,
47554
+ compress: top.compress ?? true,
47555
+ background: top.background ?? true
47556
+ };
47557
+ }
47558
+ const hasLegacyFeatureFlag = legacy && (legacy.rewrite !== undefined || legacy.compress !== undefined || legacy.background !== undefined);
47559
+ if (hasLegacyFeatureFlag) {
47560
+ const rewrite = legacy.rewrite === true;
47561
+ const compress = legacy.compress === true;
47562
+ const background = legacy.background === true;
47563
+ return { ...base, enabled: rewrite || compress || background, rewrite, compress, background };
47564
+ }
47565
+ return {
47566
+ ...base,
47567
+ enabled: surfaceDefaultEnabled,
47568
+ rewrite: surfaceDefaultEnabled,
47569
+ compress: surfaceDefaultEnabled,
47570
+ background: surfaceDefaultEnabled
47571
+ };
47572
+ }
47514
47573
  var FormatterEnum = exports_external.enum([
47515
47574
  "biome",
47516
47575
  "prettier",
@@ -47573,7 +47632,16 @@ var ExperimentalConfigSchema = exports_external.object({
47573
47632
  }).optional(),
47574
47633
  lsp_ty: exports_external.boolean().optional()
47575
47634
  });
47635
+ var BashFeaturesSchema = exports_external.object({
47636
+ rewrite: exports_external.boolean().optional(),
47637
+ compress: exports_external.boolean().optional(),
47638
+ background: exports_external.boolean().optional(),
47639
+ long_running_reminder_enabled: exports_external.boolean().optional(),
47640
+ long_running_reminder_interval_ms: exports_external.number().int().positive().optional()
47641
+ });
47642
+ var BashConfigSchema = exports_external.union([exports_external.boolean(), BashFeaturesSchema]);
47576
47643
  var AftConfigSchema = exports_external.object({
47644
+ $schema: exports_external.string().optional(),
47577
47645
  format_on_edit: exports_external.boolean().optional(),
47578
47646
  formatter_timeout_secs: exports_external.number().int().min(1).max(600).optional(),
47579
47647
  validate_on_edit: exports_external.enum(["syntax", "full"]).optional(),
@@ -47584,6 +47652,7 @@ var AftConfigSchema = exports_external.object({
47584
47652
  restrict_to_project_root: exports_external.boolean().optional(),
47585
47653
  search_index: exports_external.boolean().optional(),
47586
47654
  semantic_search: exports_external.boolean().optional(),
47655
+ bash: BashConfigSchema.optional(),
47587
47656
  experimental: ExperimentalConfigSchema.optional(),
47588
47657
  lsp: LspConfigSchema.optional(),
47589
47658
  url_fetch_allow_private: exports_external.boolean().optional(),
@@ -47639,20 +47708,15 @@ function resolveLspConfigForConfigure(config2) {
47639
47708
  }
47640
47709
  function resolveExperimentalConfigForConfigure(config2) {
47641
47710
  const overrides = {};
47642
- if (config2.experimental?.bash?.rewrite !== undefined) {
47643
- overrides.experimental_bash_rewrite = config2.experimental.bash.rewrite;
47644
- }
47645
- if (config2.experimental?.bash?.compress !== undefined) {
47646
- overrides.experimental_bash_compress = config2.experimental.bash.compress;
47647
- }
47648
- if (config2.experimental?.bash?.background !== undefined) {
47649
- overrides.experimental_bash_background = config2.experimental.bash.background;
47711
+ const bash = resolveBashConfig(config2);
47712
+ overrides.experimental_bash_rewrite = bash.rewrite;
47713
+ overrides.experimental_bash_compress = bash.compress;
47714
+ overrides.experimental_bash_background = bash.background;
47715
+ if (bash.long_running_reminder_enabled !== undefined) {
47716
+ overrides.bash_long_running_reminder_enabled = bash.long_running_reminder_enabled;
47650
47717
  }
47651
- if (config2.experimental?.bash?.long_running_reminder_enabled !== undefined) {
47652
- overrides.bash_long_running_reminder_enabled = config2.experimental.bash.long_running_reminder_enabled;
47653
- }
47654
- if (config2.experimental?.bash?.long_running_reminder_interval_ms !== undefined) {
47655
- overrides.bash_long_running_reminder_interval_ms = config2.experimental.bash.long_running_reminder_interval_ms;
47718
+ if (bash.long_running_reminder_interval_ms !== undefined) {
47719
+ overrides.bash_long_running_reminder_interval_ms = bash.long_running_reminder_interval_ms;
47656
47720
  }
47657
47721
  if (config2.experimental?.lsp_ty !== undefined) {
47658
47722
  overrides.experimental_lsp_ty = config2.experimental.lsp_ty;
@@ -47723,8 +47787,51 @@ function migrateRawConfig(rawConfig, configPath, logger) {
47723
47787
  delete rawConfig[migration.oldKey];
47724
47788
  oldKeys.push(migration.oldKey);
47725
47789
  }
47790
+ oldKeys.push(...migrateExperimentalBashBlock(rawConfig, configPath, logger));
47726
47791
  return oldKeys;
47727
47792
  }
47793
+ function migrateExperimentalBashBlock(rawConfig, configPath, logger) {
47794
+ const experimental = rawConfig.experimental;
47795
+ if (typeof experimental !== "object" || experimental === null || Array.isArray(experimental)) {
47796
+ return [];
47797
+ }
47798
+ const expRecord = experimental;
47799
+ if (!Object.hasOwn(expRecord, "bash"))
47800
+ return [];
47801
+ const legacyBash = expRecord.bash;
47802
+ if (typeof legacyBash !== "object" || legacyBash === null || Array.isArray(legacyBash)) {
47803
+ delete expRecord.bash;
47804
+ if (Object.keys(expRecord).length === 0)
47805
+ delete rawConfig.experimental;
47806
+ return ["experimental.bash"];
47807
+ }
47808
+ const bashRecord = legacyBash;
47809
+ const hasFeatureFlag = "rewrite" in bashRecord || "compress" in bashRecord || "background" in bashRecord;
47810
+ if (!hasFeatureFlag)
47811
+ return [];
47812
+ const movedKeys = Object.keys(bashRecord).map((k) => `experimental.bash.${k}`);
47813
+ if (Object.hasOwn(rawConfig, "bash")) {
47814
+ logger?.warn(`Config migration conflict at ${configPath}: experimental.bash dropped because top-level "bash" is already set`);
47815
+ } else {
47816
+ const migrated = {
47817
+ rewrite: bashRecord.rewrite === true,
47818
+ compress: bashRecord.compress === true,
47819
+ background: bashRecord.background === true
47820
+ };
47821
+ if (bashRecord.long_running_reminder_enabled !== undefined) {
47822
+ migrated.long_running_reminder_enabled = bashRecord.long_running_reminder_enabled;
47823
+ }
47824
+ if (bashRecord.long_running_reminder_interval_ms !== undefined) {
47825
+ migrated.long_running_reminder_interval_ms = bashRecord.long_running_reminder_interval_ms;
47826
+ }
47827
+ rawConfig.bash = migrated;
47828
+ }
47829
+ delete expRecord.bash;
47830
+ if (Object.keys(expRecord).length === 0) {
47831
+ delete rawConfig.experimental;
47832
+ }
47833
+ return movedKeys;
47834
+ }
47728
47835
  function migrateAftConfigFile(configPath, logger = { log: log2, warn: warn2 }) {
47729
47836
  if (!existsSync6(configPath)) {
47730
47837
  return { migrated: false, oldKeys: [] };
@@ -47849,6 +47956,22 @@ function mergeLspConfig(base, override) {
47849
47956
  return;
47850
47957
  return Object.fromEntries(Object.entries(lsp).filter(([, v]) => v !== undefined));
47851
47958
  }
47959
+ function mergeBashConfig(baseBash, overrideBash) {
47960
+ if (baseBash === undefined && overrideBash === undefined)
47961
+ return;
47962
+ if (baseBash === undefined)
47963
+ return overrideBash;
47964
+ if (overrideBash === undefined)
47965
+ return baseBash;
47966
+ const expand = (value) => {
47967
+ if (value === true)
47968
+ return { rewrite: true, compress: true, background: true };
47969
+ if (value === false)
47970
+ return { rewrite: false, compress: false, background: false };
47971
+ return { ...value ?? {} };
47972
+ };
47973
+ return { ...expand(baseBash), ...expand(overrideBash) };
47974
+ }
47852
47975
  function mergeExperimentalConfig(base, override) {
47853
47976
  const bash = {
47854
47977
  ...base?.bash,
@@ -47889,7 +48012,8 @@ var PROJECT_SAFE_TOP_LEVEL_FIELDS = new Set([
47889
48012
  "validate_on_edit",
47890
48013
  "search_index",
47891
48014
  "semantic_search",
47892
- "experimental"
48015
+ "experimental",
48016
+ "bash"
47893
48017
  ]);
47894
48018
  function pickProjectSafeFields(override) {
47895
48019
  const safe = {};
@@ -47917,13 +48041,16 @@ function mergeConfigs(base, override) {
47917
48041
  const semantic = mergeSemanticConfig(base.semantic, override.semantic);
47918
48042
  const lsp = mergeLspConfig(base.lsp, override.lsp);
47919
48043
  const experimental = mergeExperimentalConfig(base.experimental, override.experimental);
48044
+ const bash = mergeBashConfig(base.bash, override.bash);
47920
48045
  const safeOverride = pickProjectSafeFields(override);
48046
+ delete safeOverride.bash;
47921
48047
  return {
47922
48048
  ...base,
47923
48049
  ...safeOverride,
47924
48050
  ...Object.keys(formatter).length > 0 ? { formatter } : {},
47925
48051
  ...Object.keys(checker).length > 0 ? { checker } : {},
47926
48052
  ...lsp ? { lsp } : {},
48053
+ ...bash !== undefined ? { bash } : {},
47927
48054
  experimental,
47928
48055
  semantic,
47929
48056
  ...disabledTools.length > 0 ? { disabled_tools: [...new Set(disabledTools)] } : {}
@@ -47965,7 +48092,7 @@ function loadAftConfig(projectDirectory) {
47965
48092
  // src/lsp-auto-install.ts
47966
48093
  import { spawn as spawn2 } from "node:child_process";
47967
48094
  import { createHash as createHash4 } from "node:crypto";
47968
- import { createReadStream, mkdirSync as mkdirSync7, readFileSync as readFileSync5, renameSync as renameSync4, rmSync as rmSync3, statSync as statSync4 } from "node:fs";
48095
+ import { createReadStream, mkdirSync as mkdirSync7, readFileSync as readFileSync6, renameSync as renameSync4, rmSync as rmSync3, statSync as statSync4 } from "node:fs";
47969
48096
  import { join as join11 } from "node:path";
47970
48097
 
47971
48098
  // src/lsp-cache.ts
@@ -48299,19 +48426,33 @@ var NPM_LSP_TABLE = [
48299
48426
  id: "vue",
48300
48427
  npm: "@vue/language-server",
48301
48428
  binary: "vue-language-server",
48302
- extensions: ["vue"]
48429
+ extensions: ["vue"],
48430
+ rootMarkers: [
48431
+ "vue.config.js",
48432
+ "vue.config.mjs",
48433
+ "vue.config.ts",
48434
+ "nuxt.config.js",
48435
+ "nuxt.config.mjs",
48436
+ "nuxt.config.ts",
48437
+ "nuxt.config.cjs"
48438
+ ],
48439
+ packageJsonDeps: ["vue", "@vue/runtime-core", "nuxt"]
48303
48440
  },
48304
48441
  {
48305
48442
  id: "astro",
48306
48443
  npm: "@astrojs/language-server",
48307
48444
  binary: "astro-ls",
48308
- extensions: ["astro"]
48445
+ extensions: ["astro"],
48446
+ rootMarkers: ["astro.config.js", "astro.config.mjs", "astro.config.ts", "astro.config.cjs"],
48447
+ packageJsonDeps: ["astro"]
48309
48448
  },
48310
48449
  {
48311
48450
  id: "svelte",
48312
48451
  npm: "svelte-language-server",
48313
48452
  binary: "svelteserver",
48314
- extensions: ["svelte"]
48453
+ extensions: ["svelte"],
48454
+ rootMarkers: ["svelte.config.js", "svelte.config.mjs", "svelte.config.ts", "svelte.config.cjs"],
48455
+ packageJsonDeps: ["svelte", "@sveltejs/kit"]
48315
48456
  },
48316
48457
  {
48317
48458
  id: "php-intelephense",
@@ -48329,7 +48470,7 @@ var NPM_LSP_TABLE = [
48329
48470
  ];
48330
48471
 
48331
48472
  // src/lsp-project-relevance.ts
48332
- import { existsSync as existsSync7, readdirSync as readdirSync3 } from "node:fs";
48473
+ import { existsSync as existsSync7, readdirSync as readdirSync3, readFileSync as readFileSync5 } from "node:fs";
48333
48474
  import { join as join10 } from "node:path";
48334
48475
  var MAX_WALK_DIRS = 200;
48335
48476
  var MAX_WALK_DEPTH = 4;
@@ -48352,6 +48493,34 @@ function hasRootMarker(projectRoot, rootMarkers) {
48352
48493
  }
48353
48494
  return false;
48354
48495
  }
48496
+ function hasPackageJsonDep(projectRoot, depNames) {
48497
+ if (!depNames || depNames.length === 0)
48498
+ return false;
48499
+ const pkg = readPackageJson(projectRoot);
48500
+ if (!pkg)
48501
+ return false;
48502
+ const merged = {
48503
+ ...typeof pkg.dependencies === "object" && pkg.dependencies ? pkg.dependencies : {},
48504
+ ...typeof pkg.devDependencies === "object" && pkg.devDependencies ? pkg.devDependencies : {},
48505
+ ...typeof pkg.peerDependencies === "object" && pkg.peerDependencies ? pkg.peerDependencies : {}
48506
+ };
48507
+ for (const name of depNames) {
48508
+ if (Object.hasOwn(merged, name))
48509
+ return true;
48510
+ }
48511
+ return false;
48512
+ }
48513
+ function readPackageJson(projectRoot) {
48514
+ try {
48515
+ const raw = readFileSync5(join10(projectRoot, "package.json"), "utf8");
48516
+ const parsed = JSON.parse(raw);
48517
+ if (typeof parsed !== "object" || parsed === null)
48518
+ return null;
48519
+ return parsed;
48520
+ } catch {
48521
+ return null;
48522
+ }
48523
+ }
48355
48524
  function relevantExtensionsInProject(projectRoot, extToServer) {
48356
48525
  const wanted = new Set(Object.keys(extToServer).map((ext) => ext.toLowerCase()));
48357
48526
  const found = new Set;
@@ -48444,6 +48613,8 @@ async function probeRegistry(npmPackage, graceDays, fetchImpl2 = fetch) {
48444
48613
  function isProjectRelevant(spec, projectRoot, projectExtensions) {
48445
48614
  if (hasRootMarker(projectRoot, spec.rootMarkers))
48446
48615
  return true;
48616
+ if (hasPackageJsonDep(projectRoot, spec.packageJsonDeps))
48617
+ return true;
48447
48618
  const extensions = projectExtensions();
48448
48619
  return spec.extensions.some((ext) => extensions.has(ext.toLowerCase()));
48449
48620
  }
@@ -48667,7 +48838,7 @@ function installedBinaryPath(spec) {
48667
48838
  return null;
48668
48839
  }
48669
48840
  function sha256OfFileSync(path2) {
48670
- return createHash4("sha256").update(readFileSync5(path2)).digest("hex");
48841
+ return createHash4("sha256").update(readFileSync6(path2)).digest("hex");
48671
48842
  }
48672
48843
  function quarantineCachedNpmInstall(spec, reason) {
48673
48844
  const packageDir = lspPackageDir(spec.npm);
@@ -48761,7 +48932,7 @@ import {
48761
48932
  lstatSync as lstatSync2,
48762
48933
  mkdirSync as mkdirSync8,
48763
48934
  readdirSync as readdirSync4,
48764
- readFileSync as readFileSync6,
48935
+ readFileSync as readFileSync7,
48765
48936
  readlinkSync as readlinkSync2,
48766
48937
  realpathSync as realpathSync3,
48767
48938
  renameSync as renameSync5,
@@ -48895,7 +49066,7 @@ function readGithubInstalledMetaIn(installDir) {
48895
49066
  const path2 = join12(installDir, INSTALLED_META_FILE2);
48896
49067
  if (!statSync5(path2).isFile())
48897
49068
  return null;
48898
- const parsed = JSON.parse(readFileSync6(path2, "utf8"));
49069
+ const parsed = JSON.parse(readFileSync7(path2, "utf8"));
48899
49070
  if (typeof parsed.version !== "string" || parsed.version.length === 0)
48900
49071
  return null;
48901
49072
  return {
@@ -48936,7 +49107,7 @@ function sha256OfFile(path2) {
48936
49107
  });
48937
49108
  }
48938
49109
  function sha256OfFileSync2(path2) {
48939
- return createHash5("sha256").update(readFileSync6(path2)).digest("hex");
49110
+ return createHash5("sha256").update(readFileSync7(path2)).digest("hex");
48940
49111
  }
48941
49112
  async function fetchReleaseByTag(githubRepo, tag, fetchImpl2, signal) {
48942
49113
  const candidates = [];
@@ -49570,7 +49741,7 @@ function discoverRelevantGithubServers(projectRoot) {
49570
49741
  }
49571
49742
 
49572
49743
  // src/notifications.ts
49573
- import { existsSync as existsSync9, mkdirSync as mkdirSync9, readFileSync as readFileSync7, writeFileSync as writeFileSync6 } from "node:fs";
49744
+ import { existsSync as existsSync9, mkdirSync as mkdirSync9, readFileSync as readFileSync8, writeFileSync as writeFileSync6 } from "node:fs";
49574
49745
  import { join as join13 } from "node:path";
49575
49746
  var WARNING_MARKER = "\uD83D\uDD27 AFT: ⚠️";
49576
49747
  var FEATURE_MARKER = "\uD83D\uDD27 AFT: ✨";
@@ -49663,16 +49834,23 @@ async function deliverConfigureWarnings(opts, warnings) {
49663
49834
  await recordWarning(opts.bridge, key);
49664
49835
  }
49665
49836
  }
49666
- function sendFeatureAnnouncement(version2, features, storageDir) {
49837
+ function sendFeatureAnnouncement(version2, features, footer, storageDir) {
49667
49838
  const versionFile = join13(storageDir, "last_announced_version");
49668
49839
  try {
49669
49840
  if (existsSync9(versionFile)) {
49670
- const lastVersion = readFileSync7(versionFile, "utf-8").trim();
49841
+ const lastVersion = readFileSync8(versionFile, "utf-8").trim();
49671
49842
  if (lastVersion === version2)
49672
49843
  return;
49673
49844
  }
49674
49845
  } catch {}
49675
- log2([`${FEATURE_MARKER} v${version2}:`, ...features.map((feature) => ` • ${feature}`)].join(`
49846
+ const sections = [
49847
+ `${FEATURE_MARKER} v${version2}:`,
49848
+ ...features.map((feature) => ` • ${feature}`)
49849
+ ];
49850
+ if (typeof footer === "string" && footer.trim().length > 0) {
49851
+ sections.push("", footer);
49852
+ }
49853
+ log2(sections.join(`
49676
49854
  `));
49677
49855
  try {
49678
49856
  mkdirSync9(storageDir, { recursive: true });
@@ -50929,6 +51107,7 @@ function buildMutationResult(filePath, response) {
50929
51107
  const replacements = response.replacements;
50930
51108
  const diagnostics = response.lsp_diagnostics;
50931
51109
  const truncated = diffObj?.truncated === true;
51110
+ const noOp = response.no_op === true;
50932
51111
  const formatted = response.formatted;
50933
51112
  const formatSkippedReason = response.format_skipped_reason;
50934
51113
  const globFormatSkipReasons = response.format_skip_reasons;
@@ -50949,6 +51128,11 @@ ${diffText}`;
50949
51128
  text += `
50950
51129
 
50951
51130
  (diff truncated — file too large to include before/after content)`;
51131
+ }
51132
+ if (noOp) {
51133
+ text += `
51134
+
51135
+ Note: no net file change — the match was found and applied, but the file content is byte-identical to before. Likely causes: oldString and newString are identical, or a formatter normalized the change away.`;
50952
51136
  }
50953
51137
  const skipNote = formatSkipReasonNote(formatSkippedReason);
50954
51138
  if (skipNote)
@@ -50977,7 +51161,8 @@ ${formatDiagnosticsText(diagnostics)}`;
50977
51161
  diagnostics,
50978
51162
  truncated: truncated || undefined,
50979
51163
  formatted,
50980
- formatSkippedReason
51164
+ formatSkippedReason,
51165
+ noOp: noOp || undefined
50981
51166
  }
50982
51167
  };
50983
51168
  }
@@ -51048,7 +51233,12 @@ ${theme.fg("error", errorText || "edit failed")}`);
51048
51233
  const deletions = details?.deletions ?? 0;
51049
51234
  const text = reuseText3(context.lastComponent);
51050
51235
  const summary = theme.fg("success", `+${additions}/-${deletions}`);
51051
- const suffix = details?.truncated ? ` ${theme.fg("muted", "(diff truncated)")}` : "";
51236
+ let suffix = "";
51237
+ if (details?.truncated) {
51238
+ suffix = ` ${theme.fg("muted", "(diff truncated)")}`;
51239
+ } else if (details?.noOp) {
51240
+ suffix = ` ${theme.fg("muted", "(no net change)")}`;
51241
+ }
51052
51242
  text.setText(`
51053
51243
  ${summary}${suffix}`);
51054
51244
  return text;
@@ -52245,7 +52435,7 @@ function buildHintsFromConfig(config2, absentTools, hoistBuiltins) {
52245
52435
  toolSurface: config2.tool_surface ?? "recommended",
52246
52436
  hoistBuiltins,
52247
52437
  semanticEnabled: config2.semantic_search === true,
52248
- bashBackgroundEnabled: config2.experimental?.bash?.background === true,
52438
+ bashBackgroundEnabled: resolveBashConfig(config2).background,
52249
52439
  absentTools
52250
52440
  });
52251
52441
  }
@@ -52322,16 +52512,13 @@ var PLUGIN_VERSION = (() => {
52322
52512
  return "0.0.0";
52323
52513
  }
52324
52514
  })();
52325
- var ANNOUNCEMENT_VERSION = "0.18.0";
52515
+ var ANNOUNCEMENT_VERSION = "0.28.0";
52326
52516
  var ANNOUNCEMENT_FEATURES = [
52327
- `New experimental features AFT now optionally hoists bash:
52328
- - Run bash scripts in the background.
52329
- - Initial output compression for git, cargo, npm, bun, pnpm, pytest, tsc (more in 0.19).
52330
- - Rewrite cat/grep/find/sed/ls into AFT counterparts for faster, formatted output.
52331
- Check GitHub for how to enable.`,
52332
- "Trigram grep/glob and semantic search (aft_search) graduated out of experimental.",
52333
- "Lots of bugfixes and new end-to-end test coverage."
52517
+ "Bash hoisting is now default-on. Configure with top-level `bash: { rewrite, compress, background }` instead of `experimental.bash.*`old config migrates automatically on first launch.",
52518
+ "Vue, Astro, and Svelte language servers now auto-install when the framework appears in your package.json (fixes #48).",
52519
+ "Native Windows ARM64 binary ARM64 hosts no longer fall back to x64 under emulation."
52334
52520
  ];
52521
+ var ANNOUNCEMENT_FOOTER = "Join us on Discord: https://discord.gg/F2uWxjGnU";
52335
52522
  var ALL_ONLY_TOOLS = new Set([
52336
52523
  "aft_navigate",
52337
52524
  "aft_delete",
@@ -52631,11 +52818,10 @@ ${lines}
52631
52818
  }
52632
52819
  })();
52633
52820
  if (ANNOUNCEMENT_VERSION && ANNOUNCEMENT_FEATURES.length > 0) {
52634
- sendFeatureAnnouncement(ANNOUNCEMENT_VERSION, ANNOUNCEMENT_FEATURES, storageDir);
52821
+ sendFeatureAnnouncement(ANNOUNCEMENT_VERSION, ANNOUNCEMENT_FEATURES, ANNOUNCEMENT_FOOTER, storageDir);
52635
52822
  }
52636
52823
  const surface = resolveToolSurface(config2);
52637
- const anyBashExperimental = config2.experimental?.bash?.rewrite === true || config2.experimental?.bash?.compress === true || config2.experimental?.bash?.background === true;
52638
- if (surface.hoistBash && anyBashExperimental) {
52824
+ if (surface.hoistBash && resolveBashConfig(config2).enabled) {
52639
52825
  registerBashTool(pi, ctx);
52640
52826
  }
52641
52827
  registerHoistedTools(pi, ctx, surface);
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-auto-install.d.ts","sourceRoot":"","sources":["../src/lsp-auto-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAwBH,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,kGAAkG;IAClG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C;;;;;;;;;OASG;IACH,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAkDD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/D;AAyVD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,iBAAiB,EACzB,SAAS,GAAE,OAAO,KAAa,GAC9B,iBAAiB,CAwEnB"}
1
+ {"version":3,"file":"lsp-auto-install.d.ts","sourceRoot":"","sources":["../src/lsp-auto-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA4BH,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,kGAAkG;IAClG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C;;;;;;;;;OASG;IACH,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AA8DD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/D;AAyVD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,iBAAiB,EACzB,SAAS,GAAE,OAAO,KAAa,GAC9B,iBAAiB,CAwEnB"}
@@ -22,6 +22,20 @@ export interface NpmServerSpec {
22
22
  readonly extensions: readonly string[];
23
23
  /** Project-root marker files (presence triggers install). Optional. */
24
24
  readonly rootMarkers?: readonly string[];
25
+ /**
26
+ * Package names whose presence in `<projectRoot>/package.json` `dependencies`,
27
+ * `devDependencies`, or `peerDependencies` triggers auto-install. Useful for
28
+ * frameworks where the config file alone (`vite.config.ts`, etc.) doesn't
29
+ * reveal which language server is needed — e.g. a Vite project is only a
30
+ * Vue project if `vue` is in package.json. Optional.
31
+ *
32
+ * GitHub issue #48: Vue, Astro, and Svelte projects can have their .vue
33
+ * /.astro/.svelte files deep enough in a monorepo (or behind skipped
34
+ * directories like `apps/`) that the bounded extension walk misses them.
35
+ * Without rootMarkers OR this hint, auto-install never triggers and the
36
+ * user sees a recurring `lsp_binary_missing` warning.
37
+ */
38
+ readonly packageJsonDeps?: readonly string[];
25
39
  }
26
40
  export declare const NPM_LSP_TABLE: readonly NpmServerSpec[];
27
41
  /** Find an entry by AFT server id. */
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-npm-table.d.ts","sourceRoot":"","sources":["../src/lsp-npm-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAoEjD,CAAC;AAEF,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEvE;AAED,oCAAoC;AACpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE/E"}
1
+ {"version":3,"file":"lsp-npm-table.d.ts","sourceRoot":"","sources":["../src/lsp-npm-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAoFjD,CAAC;AAEF,sCAAsC;AACtC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEvE;AAED,oCAAoC;AACpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE/E"}
@@ -1,4 +1,17 @@
1
1
  export declare function hasRootMarker(projectRoot: string, rootMarkers?: readonly string[]): boolean;
2
+ /**
3
+ * True when `<projectRoot>/package.json` lists any name from `depNames`
4
+ * in its `dependencies`, `devDependencies`, or `peerDependencies` maps.
5
+ *
6
+ * GitHub issue #48: Vue/Astro/Svelte projects fail the bounded extension
7
+ * walk for monorepo layouts. Detecting them by package.json dep name
8
+ * catches Vite-based setups and other frameworks where no framework-
9
+ * specific config file exists at the project root.
10
+ *
11
+ * Reads package.json once per call. Failures (missing file, invalid JSON,
12
+ * I/O error) return false — this signal is additive, never blocking.
13
+ */
14
+ export declare function hasPackageJsonDep(projectRoot: string, depNames?: readonly string[]): boolean;
2
15
  /**
3
16
  * Bounded extension scan for project relevance decisions.
4
17
  *
@@ -1 +1 @@
1
- {"version":3,"file":"lsp-project-relevance.d.ts","sourceRoot":"","sources":["../src/lsp-project-relevance.ts"],"names":[],"mappings":"AAiBA,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAM3F;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACvD,GAAG,CAAC,MAAM,CAAC,CAmCb"}
1
+ {"version":3,"file":"lsp-project-relevance.d.ts","sourceRoot":"","sources":["../src/lsp-project-relevance.ts"],"names":[],"mappings":"AAiBA,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAM3F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAe5F;AAmBD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GACvD,GAAG,CAAC,MAAM,CAAC,CAmCb"}
@@ -16,5 +16,5 @@ export interface ConfigureWarningOptions {
16
16
  projectRoot?: string;
17
17
  }
18
18
  export declare function deliverConfigureWarnings(opts: ConfigureWarningOptions, warnings: ConfigureWarning[]): Promise<void>;
19
- export declare function sendFeatureAnnouncement(version: string, features: string[], storageDir: string): void;
19
+ export declare function sendFeatureAnnouncement(version: string, features: string[], footer: string, storageDir: string): void;
20
20
  //# sourceMappingURL=notifications.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,yBAAyB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkGD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,uBAAuB,EAC7B,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CA2BN"}
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,yBAAyB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkGD,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,uBAAuB,EAC7B,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAmCN"}
@@ -58,6 +58,11 @@ export interface AftStatusSnapshot {
58
58
  };
59
59
  /** Compression aggregate passthrough; rendering is added separately. */
60
60
  compression?: StatusCompression;
61
+ /**
62
+ * Set on synthetic "not_initialized" snapshots when no bridge has spawned
63
+ * yet. Renderers display this in place of empty status rows.
64
+ */
65
+ message?: string;
61
66
  }
62
67
  export declare function formatBytes(bytes: number): string;
63
68
  export declare function coerceAftStatus(response: Record<string, unknown>): AftStatusSnapshot;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/shared/status.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,0BAA0B,CAAC;IACpC,OAAO,EAAE,0BAA0B,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,cAAc,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,wBAAwB,EAAE,OAAO,CAAC;QAClC,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,wEAAwE;IACxE,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAqDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAajD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CA8DpF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA+D3E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiEtE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/shared/status.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,0BAA0B,CAAC;IACpC,OAAO,EAAE,0BAA0B,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,cAAc,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,wBAAwB,EAAE,OAAO,CAAC;QAClC,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,wEAAwE;IACxE,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAajD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CA+DpF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA+D3E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiEtE"}
@@ -55,6 +55,13 @@ interface FileMutationDetails {
55
55
  * or accept the unformatted result.
56
56
  */
57
57
  formatSkippedReason?: string;
58
+ /**
59
+ * v0.27.1: Rust returns `no_op: true` when the post-write file content
60
+ * is byte-identical to the pre-write state. This separates "matched but
61
+ * produced no change" from a real `+0/-0` failure mode in the UI.
62
+ * See GitHub #45.
63
+ */
64
+ noOp?: boolean;
58
65
  }
59
66
  export declare function registerHoistedTools(pi: ExtensionAPI, ctx: PluginContext, surface: ToolSurfaceFlags): void;
60
67
  /**
@@ -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,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiFjD,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,CAwLN;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"}
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,iCAAiC,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiFjD,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;IAC7B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAwLN;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,eAAe,CAAC,mBAAmB,CAAC,CAiGtC;AAyJD;;;;;;;;;;;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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-hints.d.ts","sourceRoot":"","sources":["../src/workflow-hints.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,KAAK,CAAC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kEAAkE;IAClE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CA2DzE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,IAAI,CAQf;AAMD,UAAU,gBAAgB;IACxB,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,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CA8BN"}
1
+ {"version":3,"file":"workflow-hints.d.ts","sourceRoot":"","sources":["../src/workflow-hints.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,KAAK,CAAC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kEAAkE;IAClE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CA2DzE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,IAAI,CAYf;AAMD,UAAU,gBAAgB;IACxB,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,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CA8BN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cortexkit/aft-pi",
3
- "version": "0.27.0",
3
+ "version": "0.28.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,19 @@
22
22
  "prepublishOnly": "bun run build"
23
23
  },
24
24
  "dependencies": {
25
- "@cortexkit/aft-bridge": "0.27.0",
25
+ "@cortexkit/aft-bridge": "0.28.0",
26
26
  "typebox": "^1.1.24",
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.27.0",
33
- "@cortexkit/aft-darwin-x64": "0.27.0",
34
- "@cortexkit/aft-linux-arm64": "0.27.0",
35
- "@cortexkit/aft-linux-x64": "0.27.0",
36
- "@cortexkit/aft-win32-x64": "0.27.0"
32
+ "@cortexkit/aft-darwin-arm64": "0.28.0",
33
+ "@cortexkit/aft-darwin-x64": "0.28.0",
34
+ "@cortexkit/aft-linux-arm64": "0.28.0",
35
+ "@cortexkit/aft-linux-x64": "0.28.0",
36
+ "@cortexkit/aft-win32-arm64": "0.28.0",
37
+ "@cortexkit/aft-win32-x64": "0.28.0"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@earendil-works/pi-coding-agent": "*",