@mrpatronz/nexusflow 1.9.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/agent/ProviderRegistry.d.ts +12 -1
  2. package/dist/agent/ProviderRegistry.d.ts.map +1 -1
  3. package/dist/agent/ProviderRegistry.js.map +1 -1
  4. package/dist/agent/ProviderRegistry.test.js +1 -0
  5. package/dist/agent/ProviderRegistry.test.js.map +1 -1
  6. package/dist/agent/adapters.d.ts +14 -0
  7. package/dist/agent/adapters.d.ts.map +1 -1
  8. package/dist/agent/adapters.js +39 -4
  9. package/dist/agent/adapters.js.map +1 -1
  10. package/dist/agent/adapters.test.d.ts +2 -0
  11. package/dist/agent/adapters.test.d.ts.map +1 -0
  12. package/dist/agent/adapters.test.js +49 -0
  13. package/dist/agent/adapters.test.js.map +1 -0
  14. package/dist/agent/cliAvailability.d.ts +48 -0
  15. package/dist/agent/cliAvailability.d.ts.map +1 -0
  16. package/dist/agent/cliAvailability.js +112 -0
  17. package/dist/agent/cliAvailability.js.map +1 -0
  18. package/dist/agent/cliAvailability.test.d.ts +2 -0
  19. package/dist/agent/cliAvailability.test.d.ts.map +1 -0
  20. package/dist/agent/cliAvailability.test.js +105 -0
  21. package/dist/agent/cliAvailability.test.js.map +1 -0
  22. package/dist/analyzers/detect-deps.d.ts.map +1 -1
  23. package/dist/analyzers/detect-deps.js +16 -19
  24. package/dist/analyzers/detect-deps.js.map +1 -1
  25. package/dist/analyzers/index.d.ts +0 -2
  26. package/dist/analyzers/index.d.ts.map +1 -1
  27. package/dist/analyzers/index.js +6 -9
  28. package/dist/analyzers/index.js.map +1 -1
  29. package/dist/commands/commands.test.js +4 -3
  30. package/dist/commands/commands.test.js.map +1 -1
  31. package/dist/commands/create.d.ts.map +1 -1
  32. package/dist/commands/create.js.map +1 -1
  33. package/dist/commands/knowledge.d.ts +10 -0
  34. package/dist/commands/knowledge.d.ts.map +1 -1
  35. package/dist/commands/knowledge.js +27 -1
  36. package/dist/commands/knowledge.js.map +1 -1
  37. package/dist/commands/knowledge.test.d.ts +2 -0
  38. package/dist/commands/knowledge.test.d.ts.map +1 -0
  39. package/dist/commands/knowledge.test.js +77 -0
  40. package/dist/commands/knowledge.test.js.map +1 -0
  41. package/dist/commands/refresh.d.ts +2 -4
  42. package/dist/commands/refresh.d.ts.map +1 -1
  43. package/dist/commands/refresh.js +4 -20
  44. package/dist/commands/refresh.js.map +1 -1
  45. package/dist/core/adapters/registry.d.ts.map +1 -1
  46. package/dist/core/adapters/registry.js +8 -3
  47. package/dist/core/adapters/registry.js.map +1 -1
  48. package/dist/core/adapters/storage.test.js +5 -24
  49. package/dist/core/adapters/storage.test.js.map +1 -1
  50. package/dist/core/analysis-cache.d.ts +15 -8
  51. package/dist/core/analysis-cache.d.ts.map +1 -1
  52. package/dist/core/analysis-cache.js +61 -10
  53. package/dist/core/analysis-cache.js.map +1 -1
  54. package/dist/core/analysis-cache.test.js +17 -4
  55. package/dist/core/analysis-cache.test.js.map +1 -1
  56. package/dist/core/config.d.ts.map +1 -1
  57. package/dist/core/config.js +5 -4
  58. package/dist/core/config.js.map +1 -1
  59. package/dist/core/doctor.d.ts.map +1 -1
  60. package/dist/core/doctor.js +9 -5
  61. package/dist/core/doctor.js.map +1 -1
  62. package/dist/core/knowledge.d.ts +14 -4
  63. package/dist/core/knowledge.d.ts.map +1 -1
  64. package/dist/core/knowledge.js +64 -14
  65. package/dist/core/knowledge.js.map +1 -1
  66. package/dist/core/knowledge.test.js +54 -2
  67. package/dist/core/knowledge.test.js.map +1 -1
  68. package/dist/core/locks.d.ts +43 -0
  69. package/dist/core/locks.d.ts.map +1 -0
  70. package/dist/core/locks.js +102 -0
  71. package/dist/core/locks.js.map +1 -0
  72. package/dist/core/locks.test.d.ts +2 -0
  73. package/dist/core/locks.test.d.ts.map +1 -0
  74. package/dist/core/locks.test.js +95 -0
  75. package/dist/core/locks.test.js.map +1 -0
  76. package/dist/core/ports/storage.d.ts +3 -3
  77. package/dist/core/ports/storage.d.ts.map +1 -1
  78. package/dist/core/refresh.d.ts +12 -13
  79. package/dist/core/refresh.d.ts.map +1 -1
  80. package/dist/core/refresh.js +14 -11
  81. package/dist/core/refresh.js.map +1 -1
  82. package/dist/core/refresh.test.js +17 -11
  83. package/dist/core/refresh.test.js.map +1 -1
  84. package/dist/core/scheduler.d.ts.map +1 -1
  85. package/dist/core/scheduler.js +2 -65
  86. package/dist/core/scheduler.js.map +1 -1
  87. package/dist/core/sync.js +3 -3
  88. package/dist/core/sync.js.map +1 -1
  89. package/dist/core/worktree.js +2 -2
  90. package/dist/core/worktree.js.map +1 -1
  91. package/dist/core/worktree.test.js +2 -2
  92. package/dist/core/worktree.test.js.map +1 -1
  93. package/dist/generators/base.d.ts +31 -2
  94. package/dist/generators/base.d.ts.map +1 -1
  95. package/dist/generators/base.js +174 -238
  96. package/dist/generators/base.js.map +1 -1
  97. package/dist/generators/base.test.js +231 -24
  98. package/dist/generators/base.test.js.map +1 -1
  99. package/dist/generators/claude.d.ts +19 -5
  100. package/dist/generators/claude.d.ts.map +1 -1
  101. package/dist/generators/claude.js +33 -11
  102. package/dist/generators/claude.js.map +1 -1
  103. package/dist/generators/index.d.ts +10 -9
  104. package/dist/generators/index.d.ts.map +1 -1
  105. package/dist/generators/index.js +103 -118
  106. package/dist/generators/index.js.map +1 -1
  107. package/dist/generators/plan-generator.d.ts.map +1 -1
  108. package/dist/generators/plan-generator.js +217 -193
  109. package/dist/generators/plan-generator.js.map +1 -1
  110. package/dist/generators/plan-generator.test.d.ts +2 -0
  111. package/dist/generators/plan-generator.test.d.ts.map +1 -0
  112. package/dist/generators/plan-generator.test.js +217 -0
  113. package/dist/generators/plan-generator.test.js.map +1 -0
  114. package/dist/gui/assets/{DashboardPage-C3NH97y2.js → DashboardPage-HNC3-OP0.js} +1 -1
  115. package/dist/gui/assets/{GettingStartedPage-og-Kv7Sm.js → GettingStartedPage-Dguoya_Z.js} +1 -1
  116. package/dist/gui/assets/{ProjectsPage-COqqadEr.js → ProjectsPage-DVR4j4sw.js} +1 -1
  117. package/dist/gui/assets/{ScaffoldRepoInline-DRipQsos.js → ScaffoldRepoInline-D-2ZeuDK.js} +1 -1
  118. package/dist/gui/assets/{SettingsPage-CpU3V9oU.js → SettingsPage-Bauo77q3.js} +1 -1
  119. package/dist/gui/assets/{StartWorkPage-DIND0hJy.js → StartWorkPage-DvuFEa5Y.js} +1 -1
  120. package/dist/gui/assets/{StrategiesPage-6LWOnKdk.js → StrategiesPage-Cizm0GWk.js} +1 -1
  121. package/dist/gui/assets/{WorkspacesPage-BUqgOhuy.js → WorkspacesPage-DYOVfZqy.js} +1 -1
  122. package/dist/gui/assets/{index-CyYbQwRf.js → index-BqeoAIB1.js} +6 -6
  123. package/dist/gui/index.html +1 -1
  124. package/dist/index.js +2 -4
  125. package/dist/index.js.map +1 -1
  126. package/dist/mcp/tools.d.ts.map +1 -1
  127. package/dist/mcp/tools.js +11 -15
  128. package/dist/mcp/tools.js.map +1 -1
  129. package/dist/resources/workflows/plan-implement-review.md +8 -0
  130. package/dist/resources/workflows/research-verify.md +6 -0
  131. package/dist/resources/workflows/solo-developer.md +3 -0
  132. package/dist/server.d.ts.map +1 -1
  133. package/dist/server.js +1 -2
  134. package/dist/server.js.map +1 -1
  135. package/dist/server.test.js +4 -2
  136. package/dist/server.test.js.map +1 -1
  137. package/dist/types.d.ts +0 -24
  138. package/dist/types.d.ts.map +1 -1
  139. package/dist/utils/prompts.js +2 -2
  140. package/dist/utils/prompts.js.map +1 -1
  141. package/dist/utils/resources.d.ts +28 -0
  142. package/dist/utils/resources.d.ts.map +1 -0
  143. package/dist/utils/resources.js +54 -0
  144. package/dist/utils/resources.js.map +1 -0
  145. package/dist/utils/workflow-advisor.d.ts.map +1 -1
  146. package/dist/utils/workflow-advisor.js +17 -27
  147. package/dist/utils/workflow-advisor.js.map +1 -1
  148. package/dist/utils/workflows.d.ts.map +1 -1
  149. package/dist/utils/workflows.js +6 -2
  150. package/dist/utils/workflows.js.map +1 -1
  151. package/package.json +5 -3
  152. package/resources/workflows/plan-implement-review.md +8 -0
  153. package/resources/workflows/research-verify.md +6 -0
  154. package/resources/workflows/solo-developer.md +3 -0
  155. package/dist/analyzers/detect-apis.d.ts +0 -19
  156. package/dist/analyzers/detect-apis.d.ts.map +0 -1
  157. package/dist/analyzers/detect-apis.js +0 -250
  158. package/dist/analyzers/detect-apis.js.map +0 -1
  159. package/dist/analyzers/messaging-analyzer.d.ts +0 -17
  160. package/dist/analyzers/messaging-analyzer.d.ts.map +0 -1
  161. package/dist/analyzers/messaging-analyzer.js +0 -229
  162. package/dist/analyzers/messaging-analyzer.js.map +0 -1
  163. package/dist/core/adapters/vault-storage.d.ts +0 -16
  164. package/dist/core/adapters/vault-storage.d.ts.map +0 -1
  165. package/dist/core/adapters/vault-storage.js +0 -77
  166. package/dist/core/adapters/vault-storage.js.map +0 -1
  167. package/dist/core/graph.d.ts +0 -35
  168. package/dist/core/graph.d.ts.map +0 -1
  169. package/dist/core/graph.js +0 -281
  170. package/dist/core/graph.js.map +0 -1
  171. package/dist/generators/diff-context.d.ts +0 -6
  172. package/dist/generators/diff-context.d.ts.map +0 -1
  173. package/dist/generators/diff-context.js +0 -70
  174. package/dist/generators/diff-context.js.map +0 -1
  175. package/dist/generators/map-generator.d.ts +0 -15
  176. package/dist/generators/map-generator.d.ts.map +0 -1
  177. package/dist/generators/map-generator.js +0 -514
  178. package/dist/generators/map-generator.js.map +0 -1
  179. package/dist/generators/map-generator.test.d.ts +0 -2
  180. package/dist/generators/map-generator.test.d.ts.map +0 -1
  181. package/dist/generators/map-generator.test.js +0 -147
  182. package/dist/generators/map-generator.test.js.map +0 -1
@@ -6,11 +6,22 @@ export interface ProviderStatus {
6
6
  message?: string;
7
7
  icon?: string;
8
8
  }
9
+ export type AgentEvent = 'data' | 'close' | 'error' | 'system' | 'idle';
9
10
  export interface AgentHarness {
10
11
  start(cwd: string, session?: AgentSession): Promise<void>;
11
12
  send(data: string): Promise<void>;
12
13
  stop(): void;
13
- on(event: 'data' | 'close' | 'error' | 'system' | 'idle', listener: (...args: any[]) => void): this;
14
+ on(event: AgentEvent, listener: (...args: any[]) => void): this;
15
+ /**
16
+ * Detaches a listener, so a caller that attaches per operation on a long-lived
17
+ * harness can clean up rather than accumulating listener sets. Satisfied for
18
+ * free by EventEmitter, which every adapter extends.
19
+ *
20
+ * Nothing in this package calls it today — the caller it was added for was the
21
+ * workflow engine — but it belongs on the interface: `on` without `off` makes
22
+ * any repeated use of a harness a leak.
23
+ */
24
+ off(event: AgentEvent, listener: (...args: any[]) => void): this;
14
25
  }
15
26
  export interface ProviderAdapter {
16
27
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;IACb,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACrG;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,IAAI,OAAO,CAAC;IACxB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC;IACvC,cAAc,IAAI,YAAY,CAAC;CAChC;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,SAAS,CAA2C;IAE5D,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAIlC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,YAAY,IAAI,cAAc,EAAE;CASjC;AAED,eAAO,MAAM,gBAAgB,sBAA6B,CAAC"}
1
+ {"version":3,"file":"ProviderRegistry.d.ts","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC;IACb,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE;;;;;;;;OAQG;IACH,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,IAAI,OAAO,CAAC;IACxB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC;IACvC,cAAc,IAAI,YAAY,CAAC;CAChC;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,SAAS,CAA2C;IAE5D,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAIlC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,YAAY,IAAI,cAAc,EAAE;CASjC;AAED,eAAO,MAAM,gBAAgB,sBAA6B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AA0BA,MAAM,oBAAoB;IAChB,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE5D,QAAQ,CAAC,QAAyB;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE;YAC9B,OAAO,EAAE,CAAC,CAAC,gBAAgB,EAAE;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"ProviderRegistry.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.ts"],"names":[],"mappings":"AAsCA,MAAM,oBAAoB;IAChB,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE5D,QAAQ,CAAC,QAAyB;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE;YAC9B,OAAO,EAAE,CAAC,CAAC,gBAAgB,EAAE;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
@@ -8,6 +8,7 @@ class MockAgentHarness {
8
8
  async send(data) { }
9
9
  stop() { }
10
10
  on(event, listener) { return this; }
11
+ off(event, listener) { return this; }
11
12
  }
12
13
  // The registry is a shared singleton without a reset method, so each test
13
14
  // registers its own uniquely-named provider to stay order-independent.
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderRegistry.test.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProviderRegistry.test.js","sourceRoot":"","sources":["../../src/agent/ProviderRegistry.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,17 @@
1
1
  import { ProviderRegistry } from './ProviderRegistry.js';
2
+ /**
3
+ * Wraps a synchronous detector in a short-lived cache.
4
+ *
5
+ * `isConfigured()` and `getStatusMessage()` are separate calls on the same
6
+ * provider, so listing statuses ran every detector twice — and each one walks
7
+ * PATH with a `statSync` per directory per PATHEXT entry, then reads a
8
+ * credentials file. `getStatuses()` over both CLI providers meant four full
9
+ * scans per HTTP status request.
10
+ *
11
+ * A few seconds is the right window: long enough to collapse the duplicate calls
12
+ * within one request, short enough that installing a CLI or signing in is
13
+ * noticed almost immediately rather than needing a restart.
14
+ */
15
+ export declare function cachedStatus<T>(detect: () => T, ttlMs?: number): () => T;
2
16
  export { ProviderRegistry };
3
17
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAoDzD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAmCzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,SAAQ,GAAG,MAAM,CAAC,CAevE;AA2BD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { ProviderRegistry } from './ProviderRegistry.js';
2
+ import { detectAntigravityCliStatus, detectClaudeCliStatus } from './cliAvailability.js';
2
3
  import { NativeClaudeAgent } from './NativeClaudeAgent.js';
3
4
  import { NativeAgent } from './NativeAgent.js';
4
5
  import { NativeGoogleAgent } from './NativeGoogleAgent.js';
@@ -28,20 +29,54 @@ ProviderRegistry.register({
28
29
  getStatusMessage: () => process.env.GEMINI_API_KEY ? undefined : 'Google API key is not configured in GEMINI_API_KEY.',
29
30
  createInstance: () => new NativeGoogleAgent()
30
31
  });
32
+ /**
33
+ * Wraps a synchronous detector in a short-lived cache.
34
+ *
35
+ * `isConfigured()` and `getStatusMessage()` are separate calls on the same
36
+ * provider, so listing statuses ran every detector twice — and each one walks
37
+ * PATH with a `statSync` per directory per PATHEXT entry, then reads a
38
+ * credentials file. `getStatuses()` over both CLI providers meant four full
39
+ * scans per HTTP status request.
40
+ *
41
+ * A few seconds is the right window: long enough to collapse the duplicate calls
42
+ * within one request, short enough that installing a CLI or signing in is
43
+ * noticed almost immediately rather than needing a restart.
44
+ */
45
+ export function cachedStatus(detect, ttlMs = 5_000) {
46
+ // Freshness is tracked with a flag, not by testing the value: keying on
47
+ // `value === undefined` would make a detector that legitimately returns
48
+ // undefined re-run on every read, which is the case this exists to avoid.
49
+ let cached = null;
50
+ let readAt = 0;
51
+ return () => {
52
+ const now = Date.now();
53
+ if (!cached || now - readAt >= ttlMs) {
54
+ cached = { value: detect() };
55
+ readAt = now;
56
+ }
57
+ return cached.value;
58
+ };
59
+ }
60
+ // The CLI providers need no API key, but "installed" is not the same as "usable":
61
+ // a CLI can be on PATH and still have no credentials a spawned process can use.
62
+ // Reporting that up front beats letting the first turn fail with whatever the CLI
63
+ // happened to print.
64
+ const claudeCliStatus = cachedStatus(() => detectClaudeCliStatus());
65
+ const antigravityCliStatus = cachedStatus(() => detectAntigravityCliStatus());
31
66
  ProviderRegistry.register({
32
67
  id: 'claude-cli',
33
68
  name: 'Claude Code (Local CLI)',
34
69
  icon: 'Terminal',
35
- isConfigured: () => true, // Assume the CLI is installed for now
36
- getStatusMessage: () => undefined, // No API key required!
70
+ isConfigured: () => claudeCliStatus().usable,
71
+ getStatusMessage: () => claudeCliStatus().message,
37
72
  createInstance: () => new ClaudeCliAdapter()
38
73
  });
39
74
  ProviderRegistry.register({
40
75
  id: 'antigravity-cli',
41
76
  name: 'Antigravity (Local CLI)',
42
77
  icon: 'Terminal',
43
- isConfigured: () => true, // Assume the CLI is installed for now
44
- getStatusMessage: () => undefined, // No API key required!
78
+ isConfigured: () => antigravityCliStatus().usable,
79
+ getStatusMessage: () => antigravityCliStatus().message,
45
80
  createInstance: () => new AntigravityCliAdapter()
46
81
  });
47
82
  export { ProviderRegistry };
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,KAAK;IACX,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACnD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2DAA2D;IAC/H,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC9C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;IAChD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD;IACtH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;CACxC,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;IAChD,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD;IACtH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC9C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,sCAAsC;IAChE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,uBAAuB;IAC1D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE;CAC7C,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,CAAC;IACxB,EAAE,EAAE,iBAAiB;IACrB,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,sCAAsC;IAChE,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,uBAAuB;IAC1D,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE;CAClD,CAAC,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agent/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.test.d.ts","sourceRoot":"","sources":["../../src/agent/adapters.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { cachedStatus } from './adapters.js';
3
+ describe('cachedStatus', () => {
4
+ afterEach(() => {
5
+ vi.useRealTimers();
6
+ });
7
+ it('detects once for repeated reads inside the window', () => {
8
+ // isConfigured() and getStatusMessage() are separate calls on the same
9
+ // provider, so listing statuses ran every detector twice — and each walks
10
+ // PATH with a statSync per directory per PATHEXT entry, then reads a
11
+ // credentials file.
12
+ const detect = vi.fn(() => ({ usable: true }));
13
+ const read = cachedStatus(detect);
14
+ read();
15
+ read();
16
+ read();
17
+ expect(detect).toHaveBeenCalledTimes(1);
18
+ });
19
+ it('returns the same value each time it is cached', () => {
20
+ const detect = vi.fn(() => ({ usable: false, message: 'not signed in' }));
21
+ const read = cachedStatus(detect);
22
+ expect(read()).toEqual({ usable: false, message: 'not signed in' });
23
+ expect(read()).toEqual({ usable: false, message: 'not signed in' });
24
+ });
25
+ it('re-detects once the window has passed, so an install is noticed', () => {
26
+ // A permanent cache would need a restart to see a newly installed CLI.
27
+ vi.useFakeTimers();
28
+ const detect = vi.fn(() => ({ usable: false }));
29
+ const read = cachedStatus(detect, 5_000);
30
+ read();
31
+ vi.advanceTimersByTime(4_999);
32
+ read();
33
+ expect(detect).toHaveBeenCalledTimes(1);
34
+ vi.advanceTimersByTime(1);
35
+ read();
36
+ expect(detect).toHaveBeenCalledTimes(2);
37
+ });
38
+ it('caches an undefined result too', () => {
39
+ // Freshness is a flag, not a test of the value: keying on
40
+ // `value === undefined` would make a detector that legitimately returns
41
+ // undefined re-run on every read, defeating the whole point.
42
+ const detect = vi.fn(() => undefined);
43
+ const read = cachedStatus(detect);
44
+ read();
45
+ read();
46
+ expect(detect).toHaveBeenCalledTimes(1);
47
+ });
48
+ });
49
+ //# sourceMappingURL=adapters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.test.js","sourceRoot":"","sources":["../../src/agent/adapters.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,uEAAuE;QACvE,0EAA0E;QAC1E,qEAAqE;QACrE,oBAAoB;QACpB,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QAEP,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,uEAAuE;QACvE,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEzC,IAAI,EAAE,CAAC;QACP,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAExC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC;QACP,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,0DAA0D;QAC1D,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QAEP,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @module agent/cliAvailability
3
+ * Whether a local CLI agent can actually be driven headlessly.
4
+ *
5
+ * The CLI providers previously reported `isConfigured: () => true` with the note
6
+ * "assume the CLI is installed". That advertises a working provider in the UI even
7
+ * when it cannot run, so a chat opens, the first turn fails, and the message the
8
+ * user sees is whatever the CLI happened to print.
9
+ *
10
+ * The case worth naming: the Claude Code desktop app keeps OAuth tokens in memory
11
+ * and injects them into the sessions it spawns itself, so `~/.claude/.credentials.json`
12
+ * can exist with scopes but **empty tokens**. An interactive `claude` under the
13
+ * desktop app then works while an independently spawned `claude -p` cannot
14
+ * authenticate at all — the tokens simply are not on disk for it to find.
15
+ *
16
+ * Checks are synchronous because `ProviderAdapter.isConfigured()` is, and they are
17
+ * deliberately conservative: a provider is only reported unusable when there is
18
+ * positive evidence it cannot work, never merely because something is unfamiliar.
19
+ */
20
+ export interface CliStatus {
21
+ /** Whether a turn stands a chance of succeeding. */
22
+ usable: boolean;
23
+ /** User-facing explanation. Present whenever `usable` is false. */
24
+ message?: string;
25
+ }
26
+ export interface DetectOptions {
27
+ /** Overrides for tests. */
28
+ env?: NodeJS.ProcessEnv;
29
+ homeDir?: string;
30
+ /** Skips the PATH scan when availability is already known. */
31
+ hasBinary?: boolean;
32
+ }
33
+ /**
34
+ * Resolves an executable on PATH the way a shell would, honouring PATHEXT on
35
+ * Windows so `claude.cmd` and `claude.exe` both count.
36
+ */
37
+ export declare function findExecutable(name: string, env?: NodeJS.ProcessEnv): string | null;
38
+ /**
39
+ * Whether `claude` can be driven in print mode.
40
+ *
41
+ * Order matters: an API key makes the credential store irrelevant, and an absent
42
+ * store is treated as unknown rather than broken so an installation that keeps
43
+ * tokens elsewhere is never wrongly disabled.
44
+ */
45
+ export declare function detectClaudeCliStatus(options?: DetectOptions): CliStatus;
46
+ /** Whether the Antigravity CLI is present. It manages its own auth. */
47
+ export declare function detectAntigravityCliStatus(options?: DetectOptions): CliStatus;
48
+ //# sourceMappingURL=cliAvailability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliAvailability.d.ts","sourceRoot":"","sources":["../../src/agent/cliAvailability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,IAAI,CAsBhG;AAoBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAkC5E;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAUjF"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @module agent/cliAvailability
3
+ * Whether a local CLI agent can actually be driven headlessly.
4
+ *
5
+ * The CLI providers previously reported `isConfigured: () => true` with the note
6
+ * "assume the CLI is installed". That advertises a working provider in the UI even
7
+ * when it cannot run, so a chat opens, the first turn fails, and the message the
8
+ * user sees is whatever the CLI happened to print.
9
+ *
10
+ * The case worth naming: the Claude Code desktop app keeps OAuth tokens in memory
11
+ * and injects them into the sessions it spawns itself, so `~/.claude/.credentials.json`
12
+ * can exist with scopes but **empty tokens**. An interactive `claude` under the
13
+ * desktop app then works while an independently spawned `claude -p` cannot
14
+ * authenticate at all — the tokens simply are not on disk for it to find.
15
+ *
16
+ * Checks are synchronous because `ProviderAdapter.isConfigured()` is, and they are
17
+ * deliberately conservative: a provider is only reported unusable when there is
18
+ * positive evidence it cannot work, never merely because something is unfamiliar.
19
+ */
20
+ import * as fsSync from 'node:fs';
21
+ import * as os from 'node:os';
22
+ import * as path from 'node:path';
23
+ /**
24
+ * Resolves an executable on PATH the way a shell would, honouring PATHEXT on
25
+ * Windows so `claude.cmd` and `claude.exe` both count.
26
+ */
27
+ export function findExecutable(name, env = process.env) {
28
+ const pathValue = env.PATH ?? env.Path ?? '';
29
+ if (!pathValue)
30
+ return null;
31
+ const separator = process.platform === 'win32' ? ';' : ':';
32
+ const extensions = process.platform === 'win32'
33
+ ? (env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)
34
+ : [''];
35
+ for (const dir of pathValue.split(separator).filter(Boolean)) {
36
+ const base = path.join(dir.replace(/^"|"$/g, ''), name);
37
+ const candidates = [base, ...extensions.map((extension) => base + extension.toLowerCase())];
38
+ for (const candidate of candidates) {
39
+ try {
40
+ if (fsSync.statSync(candidate).isFile())
41
+ return candidate;
42
+ }
43
+ catch {
44
+ // Not here; keep looking.
45
+ }
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ /** Reads the on-disk Claude credential store. Null when absent or unreadable. */
51
+ function readStoredOauth(homeDir) {
52
+ const file = path.join(homeDir, '.claude', '.credentials.json');
53
+ try {
54
+ const parsed = JSON.parse(fsSync.readFileSync(file, 'utf-8'));
55
+ return parsed.claudeAiOauth ?? null;
56
+ }
57
+ catch {
58
+ // Missing, malformed, or stored somewhere else entirely — all "unknown".
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Whether `claude` can be driven in print mode.
64
+ *
65
+ * Order matters: an API key makes the credential store irrelevant, and an absent
66
+ * store is treated as unknown rather than broken so an installation that keeps
67
+ * tokens elsewhere is never wrongly disabled.
68
+ */
69
+ export function detectClaudeCliStatus(options = {}) {
70
+ const env = options.env ?? process.env;
71
+ const homeDir = options.homeDir ?? os.homedir();
72
+ const hasBinary = options.hasBinary ?? findExecutable('claude', env) !== null;
73
+ if (!hasBinary) {
74
+ return {
75
+ usable: false,
76
+ message: 'The claude CLI was not found on PATH. Install Claude Code, or pick a provider that uses an API key.',
77
+ };
78
+ }
79
+ if (env.ANTHROPIC_API_KEY)
80
+ return { usable: true };
81
+ const oauth = readStoredOauth(homeDir);
82
+ if (!oauth)
83
+ return { usable: true };
84
+ const hasToken = Boolean(oauth.accessToken) || Boolean(oauth.refreshToken);
85
+ if (hasToken)
86
+ return { usable: true };
87
+ // Tokens are absent, so nothing spawned from here can authenticate or renew.
88
+ const hostManaged = Boolean(env.CLAUDE_CODE_ENTRYPOINT)
89
+ || env.CLAUDE_CODE_SDK_HAS_HOST_AUTH_REFRESH === '1'
90
+ || env.CLAUDECODE === '1';
91
+ return {
92
+ usable: false,
93
+ message: hostManaged
94
+ ? 'The claude CLI is installed but its stored credentials are empty, so a headless turn cannot authenticate. '
95
+ + 'This happens when the Claude Code app holds your tokens in memory for its own sessions instead of writing them to disk. '
96
+ + 'Run `claude` in a normal terminal and sign in, or set ANTHROPIC_API_KEY and use the Claude (API) provider.'
97
+ : 'The claude CLI is installed but not signed in — its stored credentials are empty. '
98
+ + 'Run `claude` in a terminal and sign in, or set ANTHROPIC_API_KEY and use the Claude (API) provider.',
99
+ };
100
+ }
101
+ /** Whether the Antigravity CLI is present. It manages its own auth. */
102
+ export function detectAntigravityCliStatus(options = {}) {
103
+ const env = options.env ?? process.env;
104
+ const hasBinary = options.hasBinary ?? findExecutable('agy', env) !== null;
105
+ return hasBinary
106
+ ? { usable: true }
107
+ : {
108
+ usable: false,
109
+ message: 'The Antigravity CLI (`agy`) was not found on PATH.',
110
+ };
111
+ }
112
+ //# sourceMappingURL=cliAvailability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliAvailability.js","sourceRoot":"","sources":["../../src/agent/cliAvailability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAiBlC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC/E,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC7C,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACnE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAET,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,SAAS,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,iFAAiF;AACjF,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAoC,CAAC;QACjG,OAAO,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAyB,EAAE;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC9E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,qGAAqG;SAC/G,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,iBAAiB;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAEnD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3E,IAAI,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAEtC,6EAA6E;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;WAClD,GAAG,CAAC,qCAAqC,KAAK,GAAG;WACjD,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC;IAE5B,OAAO;QACL,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,WAAW;YAClB,CAAC,CAAC,4GAA4G;kBAC1G,0HAA0H;kBAC1H,4GAA4G;YAChH,CAAC,CAAC,oFAAoF;kBAClF,qGAAqG;KAC5G,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,0BAA0B,CAAC,UAAyB,EAAE;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAE3E,OAAO,SAAS;QACd,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAClB,CAAC,CAAC;YACA,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,oDAAoD;SAC9D,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cliAvailability.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliAvailability.test.d.ts","sourceRoot":"","sources":["../../src/agent/cliAvailability.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import { detectAntigravityCliStatus, detectClaudeCliStatus, findExecutable, } from './cliAvailability.js';
6
+ let home = '';
7
+ beforeEach(async () => {
8
+ home = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-cliavail-'));
9
+ });
10
+ afterEach(async () => {
11
+ await fs.rm(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
12
+ });
13
+ /** Writes a credential store with the given oauth block. */
14
+ async function writeCredentials(oauth) {
15
+ await fs.mkdir(path.join(home, '.claude'), { recursive: true });
16
+ await fs.writeFile(path.join(home, '.claude', '.credentials.json'), JSON.stringify({ claudeAiOauth: oauth }), 'utf-8');
17
+ }
18
+ /** The observed real-world shape: scopes present, every token empty. */
19
+ const HOLLOW = {
20
+ accessToken: '',
21
+ refreshToken: '',
22
+ expiresAt: 0,
23
+ scopes: ['user:inference'],
24
+ subscriptionType: 'team',
25
+ };
26
+ describe('findExecutable', () => {
27
+ it('finds a file on PATH', async () => {
28
+ const name = process.platform === 'win32' ? 'thing.cmd' : 'thing';
29
+ await fs.writeFile(path.join(home, name), '', 'utf-8');
30
+ expect(findExecutable('thing', { PATH: home, PATHEXT: '.CMD' })).not.toBeNull();
31
+ });
32
+ it('returns null when the name is not on PATH', () => {
33
+ expect(findExecutable('definitely-not-here', { PATH: home })).toBeNull();
34
+ });
35
+ it('returns null when PATH is empty', () => {
36
+ expect(findExecutable('claude', {})).toBeNull();
37
+ });
38
+ });
39
+ describe('detectClaudeCliStatus', () => {
40
+ it('is unusable when the binary is missing, and says so', () => {
41
+ const status = detectClaudeCliStatus({ hasBinary: false, env: {}, homeDir: home });
42
+ expect(status.usable).toBe(false);
43
+ expect(status.message).toMatch(/not found on PATH/);
44
+ });
45
+ it('is usable when an API key is set, regardless of the credential store', async () => {
46
+ await writeCredentials(HOLLOW);
47
+ const status = detectClaudeCliStatus({
48
+ hasBinary: true,
49
+ env: { ANTHROPIC_API_KEY: 'sk-test' },
50
+ homeDir: home,
51
+ });
52
+ expect(status.usable).toBe(true);
53
+ expect(status.message).toBeUndefined();
54
+ });
55
+ it('reports unusable when the credential store has no tokens at all', async () => {
56
+ // The real failure: an interactive claude works because its host injects
57
+ // tokens, but a spawned `claude -p` finds nothing on disk to use.
58
+ await writeCredentials(HOLLOW);
59
+ const status = detectClaudeCliStatus({ hasBinary: true, env: {}, homeDir: home });
60
+ expect(status.usable).toBe(false);
61
+ expect(status.message).toMatch(/not signed in|credentials are empty/i);
62
+ });
63
+ it('names the host-managed case when the app is providing auth', async () => {
64
+ await writeCredentials(HOLLOW);
65
+ const status = detectClaudeCliStatus({
66
+ hasBinary: true,
67
+ env: { CLAUDE_CODE_ENTRYPOINT: 'claude-desktop' },
68
+ homeDir: home,
69
+ });
70
+ expect(status.usable).toBe(false);
71
+ expect(status.message).toMatch(/holds your tokens in memory/i);
72
+ // The message must be actionable, not just descriptive.
73
+ expect(status.message).toMatch(/ANTHROPIC_API_KEY/);
74
+ });
75
+ it('is usable with an access token present', async () => {
76
+ await writeCredentials({ ...HOLLOW, accessToken: 'tok' });
77
+ expect(detectClaudeCliStatus({ hasBinary: true, env: {}, homeDir: home }).usable).toBe(true);
78
+ });
79
+ it('is usable with only a refresh token, which can mint a new one', async () => {
80
+ await writeCredentials({ ...HOLLOW, refreshToken: 'refresh' });
81
+ expect(detectClaudeCliStatus({ hasBinary: true, env: {}, homeDir: home }).usable).toBe(true);
82
+ });
83
+ it('assumes usable when there is no credential file to judge', () => {
84
+ // Conservative on purpose: an install that stores tokens elsewhere must not
85
+ // be disabled just because this particular file is absent.
86
+ const status = detectClaudeCliStatus({ hasBinary: true, env: {}, homeDir: home });
87
+ expect(status.usable).toBe(true);
88
+ });
89
+ it('assumes usable when the credential file is malformed', async () => {
90
+ await fs.mkdir(path.join(home, '.claude'), { recursive: true });
91
+ await fs.writeFile(path.join(home, '.claude', '.credentials.json'), '{ not json', 'utf-8');
92
+ expect(detectClaudeCliStatus({ hasBinary: true, env: {}, homeDir: home }).usable).toBe(true);
93
+ });
94
+ });
95
+ describe('detectAntigravityCliStatus', () => {
96
+ it('is usable when agy is on PATH', () => {
97
+ expect(detectAntigravityCliStatus({ hasBinary: true }).usable).toBe(true);
98
+ });
99
+ it('reports the missing binary otherwise', () => {
100
+ const status = detectAntigravityCliStatus({ hasBinary: false });
101
+ expect(status.usable).toBe(false);
102
+ expect(status.message).toMatch(/agy/);
103
+ });
104
+ });
105
+ //# sourceMappingURL=cliAvailability.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliAvailability.test.js","sourceRoot":"","sources":["../../src/agent/cliAvailability.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"detect-deps.d.ts","sourceRoot":"","sources":["../../src/analyzers/detect-deps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA2GpF;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CAAC,CAoEzG;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAsDvB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA6BjG"}
1
+ {"version":3,"file":"detect-deps.d.ts","sourceRoot":"","sources":["../../src/analyzers/detect-deps.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA2GpF;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CAAC,CAoEzG;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqDvB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA6BjG"}
@@ -215,26 +215,23 @@ export function findInterRepoDependencies(repoAnalyses, repoNames) {
215
215
  for (const [repoPath, a] of repoAnalyses) {
216
216
  const thisName = repoNames.get(repoPath) ?? a.name;
217
217
  const dependsOn = [];
218
- for (const dep of a.dependencies) {
218
+ // Tolerate an analysis without a dependency list rather than throwing. This
219
+ // now feeds the assistant context file on every build, so an incomplete
220
+ // analysis must degrade to "no relations known" instead of failing context
221
+ // generation outright.
222
+ for (const dep of a.dependencies ?? []) {
219
223
  const depNameLower = dep.name.toLowerCase();
220
- // 1. Direct match with a produced package
221
- if (packageToRepo.has(depNameLower)) {
222
- const targetRepo = packageToRepo.get(depNameLower);
223
- if (targetRepo !== thisName && !dependsOn.includes(targetRepo)) {
224
- dependsOn.push(targetRepo);
225
- }
226
- }
227
- else {
228
- // 2. Check if the dependency contains or is contained by a produced package name
229
- for (const [prodPkg, targetRepo] of packageToRepo) {
230
- if (targetRepo === thisName)
231
- continue;
232
- if (depNameLower.includes(prodPkg) || prodPkg.includes(depNameLower)) {
233
- if (!dependsOn.includes(targetRepo)) {
234
- dependsOn.push(targetRepo);
235
- }
236
- }
237
- }
224
+ // Exact match only. There used to be a substring fallback — `depName`
225
+ // contains a produced package name, or vice versa — and it manufactured
226
+ // dependencies out of coincidental name fragments: a repo called `core`
227
+ // beside one declaring `@babel/core`, or a repo called `commserver`
228
+ // beside one declaring `ms`. That was survivable while the only consumer
229
+ // was a graph nobody read, but this now feeds the auto-loaded context
230
+ // file, where a fabricated `needs`/`used by`/`Start with` is worse than
231
+ // silence: an assistant cannot tell an invented edge from a real one.
232
+ const targetRepo = packageToRepo.get(depNameLower);
233
+ if (targetRepo && targetRepo !== thisName && !dependsOn.includes(targetRepo)) {
234
+ dependsOn.push(targetRepo);
238
235
  }
239
236
  }
240
237
  if (dependsOn.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"detect-deps.js","sourceRoot":"","sources":["../../src/analyzers/detect-deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect-deps.js","sourceRoot":"","sources":["../../src/analyzers/detect-deps.ts"],"names":[],"mappings":"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"}