@morphllm/morphsdk 0.2.27 → 0.2.32

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 (107) hide show
  1. package/README.md +195 -3
  2. package/dist/anthropic-DpEAqqZF.d.ts +88 -0
  3. package/dist/{chunk-LFYQ6GKI.js → chunk-4OBDFXR4.js} +2 -2
  4. package/dist/{chunk-S3HTYGYF.js → chunk-B4H7N4GZ.js} +14 -2
  5. package/dist/chunk-B4H7N4GZ.js.map +1 -0
  6. package/dist/{chunk-HNYSKGCP.js → chunk-BGDEQTRF.js} +2 -2
  7. package/dist/{chunk-PRIYMEI6.js → chunk-JJ5ONKDN.js} +4 -4
  8. package/dist/{chunk-2DXRTGRH.js → chunk-Q7PDN7TS.js} +1 -1
  9. package/dist/chunk-Q7PDN7TS.js.map +1 -0
  10. package/dist/{chunk-DF2ZOO7R.js → chunk-TBVDBQZ2.js} +19 -3
  11. package/dist/chunk-TBVDBQZ2.js.map +1 -0
  12. package/dist/{chunk-22WVN4MC.js → chunk-U6ZHZ5LY.js} +11 -11
  13. package/dist/{chunk-ZKIVLLZY.js → chunk-VD7US3AJ.js} +2 -2
  14. package/dist/client.cjs +18 -2
  15. package/dist/client.cjs.map +1 -1
  16. package/dist/client.d.ts +114 -0
  17. package/dist/client.js +6 -6
  18. package/dist/git/client.cjs +18 -2
  19. package/dist/git/client.cjs.map +1 -1
  20. package/dist/git/client.d.ts +261 -0
  21. package/dist/git/client.js +1 -1
  22. package/dist/git/config.d.ts +11 -0
  23. package/dist/git/index.cjs +18 -2
  24. package/dist/git/index.cjs.map +1 -1
  25. package/dist/git/index.d.ts +5 -0
  26. package/dist/git/index.js +2 -2
  27. package/dist/git/types.cjs.map +1 -1
  28. package/dist/git/types.d.ts +102 -0
  29. package/dist/index.cjs +18 -2
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +14 -0
  32. package/dist/index.js +12 -12
  33. package/dist/modelrouter/core.d.ts +56 -0
  34. package/dist/modelrouter/index.d.ts +2 -0
  35. package/dist/modelrouter/types.d.ts +35 -0
  36. package/dist/openai-BkKsS30n.d.ts +111 -0
  37. package/dist/tools/browser/anthropic.d.ts +51 -0
  38. package/dist/tools/browser/core.d.ts +203 -0
  39. package/dist/tools/browser/index.d.ts +72 -0
  40. package/dist/tools/browser/openai.d.ts +73 -0
  41. package/dist/tools/browser/prompts.d.ts +7 -0
  42. package/dist/tools/browser/types.d.ts +255 -0
  43. package/dist/tools/browser/vercel.d.ts +69 -0
  44. package/dist/tools/codebase_search/anthropic.d.ts +40 -0
  45. package/dist/tools/codebase_search/core.d.ts +40 -0
  46. package/dist/tools/codebase_search/index.d.ts +10 -0
  47. package/dist/tools/codebase_search/index.js +3 -3
  48. package/dist/tools/codebase_search/openai.d.ts +87 -0
  49. package/dist/tools/codebase_search/prompts.d.ts +7 -0
  50. package/dist/tools/codebase_search/types.d.ts +50 -0
  51. package/dist/tools/codebase_search/vercel.d.ts +65 -0
  52. package/dist/tools/fastapply/anthropic.cjs +14 -2
  53. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  54. package/dist/tools/fastapply/anthropic.d.ts +4 -0
  55. package/dist/tools/fastapply/anthropic.js +9 -3
  56. package/dist/tools/fastapply/core.d.ts +41 -0
  57. package/dist/tools/fastapply/index.cjs +18 -9
  58. package/dist/tools/fastapply/index.cjs.map +1 -1
  59. package/dist/tools/fastapply/index.d.ts +10 -0
  60. package/dist/tools/fastapply/index.js +3 -3
  61. package/dist/tools/fastapply/openai.d.ts +4 -0
  62. package/dist/tools/fastapply/prompts.d.ts +7 -0
  63. package/dist/tools/fastapply/types.d.ts +77 -0
  64. package/dist/tools/fastapply/vercel.d.ts +4 -0
  65. package/dist/tools/index.cjs +18 -9
  66. package/dist/tools/index.cjs.map +1 -1
  67. package/dist/tools/index.d.ts +10 -0
  68. package/dist/tools/index.js +3 -3
  69. package/dist/tools/utils/resilience.d.ts +58 -0
  70. package/dist/tools/warp_grep/agent/config.d.ts +8 -0
  71. package/dist/tools/warp_grep/agent/formatter.d.ts +14 -0
  72. package/dist/tools/warp_grep/agent/grep_helpers.d.ts +16 -0
  73. package/dist/tools/warp_grep/agent/parser.d.ts +16 -0
  74. package/dist/tools/warp_grep/agent/prompt.d.ts +4 -0
  75. package/dist/tools/warp_grep/agent/runner.d.ts +10 -0
  76. package/dist/tools/warp_grep/agent/runner.js +2 -2
  77. package/dist/tools/warp_grep/agent/types.cjs.map +1 -1
  78. package/dist/tools/warp_grep/agent/types.d.ts +44 -0
  79. package/dist/tools/warp_grep/anthropic.d.ts +14 -0
  80. package/dist/tools/warp_grep/anthropic.js +6 -6
  81. package/dist/tools/warp_grep/index.d.ts +11 -0
  82. package/dist/tools/warp_grep/index.js +8 -8
  83. package/dist/tools/warp_grep/openai.d.ts +33 -0
  84. package/dist/tools/warp_grep/openai.js +6 -6
  85. package/dist/tools/warp_grep/providers/command.d.ts +48 -0
  86. package/dist/tools/warp_grep/providers/local.d.ts +30 -0
  87. package/dist/tools/warp_grep/providers/types.d.ts +49 -0
  88. package/dist/tools/warp_grep/tools/analyse.d.ts +10 -0
  89. package/dist/tools/warp_grep/tools/finish.d.ts +10 -0
  90. package/dist/tools/warp_grep/tools/grep.d.ts +8 -0
  91. package/dist/tools/warp_grep/tools/read.d.ts +9 -0
  92. package/dist/tools/warp_grep/utils/files.d.ts +3 -0
  93. package/dist/tools/warp_grep/utils/format.d.ts +4 -0
  94. package/dist/tools/warp_grep/utils/paths.d.ts +7 -0
  95. package/dist/tools/warp_grep/utils/ripgrep.d.ts +11 -0
  96. package/dist/tools/warp_grep/vercel.d.ts +33 -0
  97. package/dist/tools/warp_grep/vercel.js +6 -6
  98. package/dist/vercel-B1GZ_g9N.d.ts +69 -0
  99. package/package.json +1 -1
  100. package/dist/chunk-2DXRTGRH.js.map +0 -1
  101. package/dist/chunk-DF2ZOO7R.js.map +0 -1
  102. package/dist/chunk-S3HTYGYF.js.map +0 -1
  103. /package/dist/{chunk-LFYQ6GKI.js.map → chunk-4OBDFXR4.js.map} +0 -0
  104. /package/dist/{chunk-HNYSKGCP.js.map → chunk-BGDEQTRF.js.map} +0 -0
  105. /package/dist/{chunk-PRIYMEI6.js.map → chunk-JJ5ONKDN.js.map} +0 -0
  106. /package/dist/{chunk-22WVN4MC.js.map → chunk-U6ZHZ5LY.js.map} +0 -0
  107. /package/dist/{chunk-ZKIVLLZY.js.map → chunk-VD7US3AJ.js.map} +0 -0
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createMorphWarpGrepTool
3
- } from "../../chunk-LFYQ6GKI.js";
3
+ } from "../../chunk-4OBDFXR4.js";
4
4
  import "../../chunk-UYBIKZPM.js";
5
- import "../../chunk-G2RSY56Q.js";
6
- import "../../chunk-SMGZ6A64.js";
7
- import "../../chunk-RSLIOCOE.js";
8
- import "../../chunk-PRIYMEI6.js";
9
- import "../../chunk-HKZB23U7.js";
5
+ import "../../chunk-JJ5ONKDN.js";
10
6
  import "../../chunk-73RQWOQC.js";
11
7
  import "../../chunk-EK7OQPWD.js";
12
8
  import "../../chunk-Z2FBMSNE.js";
9
+ import "../../chunk-HKZB23U7.js";
10
+ import "../../chunk-G2RSY56Q.js";
11
+ import "../../chunk-SMGZ6A64.js";
12
+ import "../../chunk-RSLIOCOE.js";
13
13
  import "../../chunk-AFEPUNAO.js";
14
14
  import "../../chunk-TICMYDII.js";
15
15
  import "../../chunk-NDZO5IPV.js";
@@ -0,0 +1,48 @@
1
+ import { WarpGrepProvider, GrepResult, ReadResult, AnalyseEntry } from './types.js';
2
+
3
+ type ExecResult = {
4
+ stdout: string;
5
+ stderr: string;
6
+ exitCode: number;
7
+ };
8
+ declare class CommandExecProvider implements WarpGrepProvider {
9
+ private readonly opts;
10
+ constructor(opts: {
11
+ run: (cmd: string, args: string[], options?: {
12
+ cwd?: string;
13
+ env?: Record<string, string>;
14
+ }) => Promise<ExecResult>;
15
+ pathMap?: (localPath: string) => string;
16
+ cwd?: string;
17
+ env?: Record<string, string>;
18
+ readCommand?: (remotePath: string, start?: number, end?: number) => {
19
+ cmd: string;
20
+ args: string[];
21
+ };
22
+ excludes?: string[];
23
+ });
24
+ private map;
25
+ grep(params: {
26
+ pattern: string;
27
+ path: string;
28
+ }): Promise<GrepResult>;
29
+ glob(params: {
30
+ pattern: string;
31
+ path: string;
32
+ }): Promise<{
33
+ files: string[];
34
+ }>;
35
+ read(params: {
36
+ path: string;
37
+ start?: number;
38
+ end?: number;
39
+ }): Promise<ReadResult>;
40
+ analyse(params: {
41
+ path: string;
42
+ pattern?: string | null;
43
+ maxResults?: number;
44
+ maxDepth?: number;
45
+ }): Promise<AnalyseEntry[]>;
46
+ }
47
+
48
+ export { CommandExecProvider };
@@ -0,0 +1,30 @@
1
+ import { WarpGrepProvider, GrepResult, ReadResult, AnalyseEntry } from './types.js';
2
+
3
+ declare class LocalRipgrepProvider implements WarpGrepProvider {
4
+ private readonly repoRoot;
5
+ private readonly excludes;
6
+ constructor(repoRoot: string, excludes?: string[]);
7
+ grep(params: {
8
+ pattern: string;
9
+ path: string;
10
+ }): Promise<GrepResult>;
11
+ glob(params: {
12
+ pattern: string;
13
+ path: string;
14
+ }): Promise<{
15
+ files: string[];
16
+ }>;
17
+ read(params: {
18
+ path: string;
19
+ start?: number;
20
+ end?: number;
21
+ }): Promise<ReadResult>;
22
+ analyse(params: {
23
+ path: string;
24
+ pattern?: string | null;
25
+ maxResults?: number;
26
+ maxDepth?: number;
27
+ }): Promise<AnalyseEntry[]>;
28
+ }
29
+
30
+ export { LocalRipgrepProvider };
@@ -0,0 +1,49 @@
1
+ type GrepResult = {
2
+ lines: string[];
3
+ };
4
+ type ReadResult = {
5
+ lines: string[];
6
+ };
7
+ type AnalyseEntry = {
8
+ name: string;
9
+ path: string;
10
+ type: 'file' | 'dir';
11
+ depth: number;
12
+ };
13
+ interface WarpGrepProvider {
14
+ /**
15
+ * Run regex grep
16
+ */
17
+ grep(params: {
18
+ pattern: string;
19
+ path: string;
20
+ }): Promise<GrepResult>;
21
+ /**
22
+ * List files by glob pattern (optional; may fallback internally)
23
+ */
24
+ glob?(params: {
25
+ pattern: string;
26
+ path: string;
27
+ }): Promise<{
28
+ files: string[];
29
+ }>;
30
+ /**
31
+ * Read lines from a file, optionally a range (1-based inclusive)
32
+ */
33
+ read(params: {
34
+ path: string;
35
+ start?: number;
36
+ end?: number;
37
+ }): Promise<ReadResult>;
38
+ /**
39
+ * Provide a lightweight directory overview for guidance
40
+ */
41
+ analyse(params: {
42
+ path: string;
43
+ pattern?: string | null;
44
+ maxResults?: number;
45
+ maxDepth?: number;
46
+ }): Promise<AnalyseEntry[]>;
47
+ }
48
+
49
+ export type { AnalyseEntry, GrepResult, ReadResult, WarpGrepProvider };
@@ -0,0 +1,10 @@
1
+ import { WarpGrepProvider } from '../providers/types.js';
2
+
3
+ declare function toolAnalyse(provider: WarpGrepProvider, args: {
4
+ path: string;
5
+ pattern?: string | null;
6
+ maxResults?: number;
7
+ maxDepth?: number;
8
+ }): Promise<string>;
9
+
10
+ export { toolAnalyse };
@@ -0,0 +1,10 @@
1
+ import { FinishFileSpec } from '../agent/types.js';
2
+
3
+ declare function normalizeFinishFiles(files: FinishFileSpec[]): FinishFileSpec[];
4
+ declare function readFinishFiles(repoRoot: string, files: FinishFileSpec[], reader: (path: string, start: number, end: number) => Promise<string[]>): Promise<{
5
+ path: string;
6
+ ranges: Array<[number, number]>;
7
+ content: string;
8
+ }[]>;
9
+
10
+ export { normalizeFinishFiles, readFinishFiles };
@@ -0,0 +1,8 @@
1
+ import { WarpGrepProvider } from '../providers/types.js';
2
+
3
+ declare function toolGrep(provider: WarpGrepProvider, args: {
4
+ pattern: string;
5
+ path: string;
6
+ }): Promise<string>;
7
+
8
+ export { toolGrep };
@@ -0,0 +1,9 @@
1
+ import { WarpGrepProvider } from '../providers/types.js';
2
+
3
+ declare function toolRead(provider: WarpGrepProvider, args: {
4
+ path: string;
5
+ start?: number;
6
+ end?: number;
7
+ }): Promise<string>;
8
+
9
+ export { toolRead };
@@ -0,0 +1,3 @@
1
+ declare function readAllLines(filePath: string): Promise<string[]>;
2
+
3
+ export { readAllLines };
@@ -0,0 +1,4 @@
1
+ declare function section(name: string, content: string): string;
2
+ declare function joinSections(sections: string[]): string;
3
+
4
+ export { joinSections, section };
@@ -0,0 +1,7 @@
1
+ declare function resolveUnderRepo(repoRoot: string, targetPath: string): string;
2
+ declare function ensureWithinRepo(repoRoot: string, absTarget: string): void;
3
+ declare function toRepoRelative(repoRoot: string, absPath: string): string;
4
+ declare function isSymlink(p: string): boolean;
5
+ declare function isTextualFile(filePath: string, maxBytes?: number): boolean;
6
+
7
+ export { ensureWithinRepo, isSymlink, isTextualFile, resolveUnderRepo, toRepoRelative };
@@ -0,0 +1,11 @@
1
+ type ExecResult = {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ };
6
+ declare function runRipgrep(args: string[], opts?: {
7
+ cwd?: string;
8
+ env?: NodeJS.ProcessEnv;
9
+ }): Promise<ExecResult>;
10
+
11
+ export { type ExecResult, runRipgrep };
@@ -0,0 +1,33 @@
1
+ import * as ai from 'ai';
2
+ import { ChatMessage } from './agent/types.js';
3
+ import { WarpGrepProvider } from './providers/types.js';
4
+
5
+ type WarpGrepConfig = {
6
+ repoRoot: string;
7
+ provider?: WarpGrepProvider;
8
+ excludes?: string[];
9
+ includes?: string[];
10
+ debug?: boolean;
11
+ apiKey?: string;
12
+ description?: string;
13
+ };
14
+ declare function createMorphWarpGrepTool(config: WarpGrepConfig): ai.Tool<{
15
+ query: string;
16
+ }, {
17
+ success: boolean;
18
+ error: string;
19
+ messages: ChatMessage[];
20
+ contexts?: undefined;
21
+ summary?: undefined;
22
+ } | {
23
+ success: boolean;
24
+ contexts: {
25
+ file: any;
26
+ content: any;
27
+ }[];
28
+ summary: string;
29
+ error?: undefined;
30
+ messages?: undefined;
31
+ }>;
32
+
33
+ export { type WarpGrepConfig, createMorphWarpGrepTool };
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createMorphWarpGrepTool
3
- } from "../../chunk-HNYSKGCP.js";
3
+ } from "../../chunk-BGDEQTRF.js";
4
4
  import "../../chunk-UYBIKZPM.js";
5
- import "../../chunk-G2RSY56Q.js";
6
- import "../../chunk-SMGZ6A64.js";
7
- import "../../chunk-RSLIOCOE.js";
8
- import "../../chunk-PRIYMEI6.js";
9
- import "../../chunk-HKZB23U7.js";
5
+ import "../../chunk-JJ5ONKDN.js";
10
6
  import "../../chunk-73RQWOQC.js";
11
7
  import "../../chunk-EK7OQPWD.js";
12
8
  import "../../chunk-Z2FBMSNE.js";
9
+ import "../../chunk-HKZB23U7.js";
10
+ import "../../chunk-G2RSY56Q.js";
11
+ import "../../chunk-SMGZ6A64.js";
12
+ import "../../chunk-RSLIOCOE.js";
13
13
  import "../../chunk-AFEPUNAO.js";
14
14
  import "../../chunk-TICMYDII.js";
15
15
  import "../../chunk-NDZO5IPV.js";
@@ -0,0 +1,69 @@
1
+ import * as ai from 'ai';
2
+ import { EditChanges, EditFileConfig } from './tools/fastapply/types.js';
3
+
4
+ declare const editFileTool: ai.Tool<{
5
+ target_filepath: string;
6
+ instructions: string;
7
+ code_edit: string;
8
+ }, {
9
+ success: boolean;
10
+ filepath: string;
11
+ changes: EditChanges;
12
+ udiff: string | undefined;
13
+ }>;
14
+ /**
15
+ * Get the system prompt for edit_file usage
16
+ *
17
+ * Add this to your system message to guide the model on using edit_file properly.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const result = await generateText({
22
+ * model: anthropic('claude-sonnet-4-5-20250929'),
23
+ * system: getSystemPrompt(),
24
+ * tools: { editFile: editFileTool },
25
+ * prompt: "Fix bugs"
26
+ * });
27
+ * ```
28
+ */
29
+ declare function getSystemPrompt(): string;
30
+ /**
31
+ * Create a custom edit_file tool with configuration
32
+ *
33
+ * @param config - Configuration options
34
+ * @returns Vercel AI SDK tool with custom config
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const customEditTool = createEditFileTool({
39
+ * baseDir: './src',
40
+ * generateUdiff: true,
41
+ * description: 'Custom tool description for your use case'
42
+ * });
43
+ *
44
+ * const result = await generateText({
45
+ * model: anthropic('claude-sonnet-4-5-20250929'),
46
+ * tools: { editFile: customEditTool },
47
+ * prompt: "Fix bugs"
48
+ * });
49
+ * ```
50
+ */
51
+ declare function createEditFileTool(config?: EditFileConfig): ai.Tool<{
52
+ target_filepath: string;
53
+ instructions: string;
54
+ code_edit: string;
55
+ }, {
56
+ success: boolean;
57
+ filepath: string;
58
+ changes: EditChanges;
59
+ udiff: string | undefined;
60
+ }>;
61
+
62
+ declare const vercel_createEditFileTool: typeof createEditFileTool;
63
+ declare const vercel_editFileTool: typeof editFileTool;
64
+ declare const vercel_getSystemPrompt: typeof getSystemPrompt;
65
+ declare namespace vercel {
66
+ export { vercel_createEditFileTool as createEditFileTool, editFileTool as default, vercel_editFileTool as editFileTool, vercel_getSystemPrompt as getSystemPrompt };
67
+ }
68
+
69
+ export { createEditFileTool as c, editFileTool as e, getSystemPrompt as g, vercel as v };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morphllm/morphsdk",
3
- "version": "0.2.27",
3
+ "version": "0.2.32",
4
4
  "description": "TypeScript SDK and CLI for Morph Fast Apply integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../git/index.ts"],"sourcesContent":["/**\n * Morph Git SDK\n * \n * Git operations for AI agents using Morph's backend infrastructure.\n * \n * @example\n * ```typescript\n * import { MorphGit } from 'morphsdk/git';\n * \n * const morphGit = new MorphGit({\n * apiKey: process.env.MORPH_API_KEY!\n * });\n * \n * // Initialize and push\n * await morphGit.init({ repoId: 'my-project', dir: './my-project' });\n * await morphGit.add({ dir: './my-project', filepath: 'src/app.ts' });\n * await morphGit.commit({ dir: './my-project', message: 'Update' });\n * await morphGit.push({ dir: './my-project' });\n * ```\n */\n\nexport { MorphGit } from './client.js';\nexport type {\n MorphGitConfig,\n CloneOptions,\n PushOptions,\n PullOptions,\n AddOptions,\n CommitOptions,\n StatusOptions,\n LogOptions,\n CheckoutOptions,\n BranchOptions,\n DiffOptions,\n CommitObject,\n StatusResult,\n ChatMessage,\n CommitMetadata,\n} from './types.js';\n\n// Re-export isomorphic-git for advanced use cases\nexport { default as git } from 'isomorphic-git';\nexport { default as http } from 'isomorphic-git/http/node';\n\n"],"mappings":";AAyCA,SAAoB,WAAXA,gBAAsB;AAC/B,SAAoB,WAAXA,gBAAuB;","names":["default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../git/client.ts"],"sourcesContent":["/**\n * Morph Git Client - Simple, high-level Git operations\n * Built on isomorphic-git with explicit configuration\n */\n\nimport git from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\nimport fs from 'fs';\nimport type {\n CloneOptions,\n PushOptions,\n PullOptions,\n AddOptions,\n CommitOptions,\n StatusOptions,\n LogOptions,\n CheckoutOptions,\n BranchOptions,\n DiffOptions,\n CommitObject,\n StatusResult,\n MorphGitConfig,\n CommitMetadata,\n} from './types.js';\n\nconst DEFAULT_PROXY_URL = 'https://repos.morphllm.com';\n\n/**\n * MorphGit - Git operations for AI agents with Morph backend\n * \n * @example\n * ```typescript\n * import { MorphGit } from 'morphsdk/git';\n * \n * const morphGit = new MorphGit({\n * apiKey: process.env.MORPH_API_KEY!,\n * proxyUrl: 'https://repos.morphllm.com' // Optional\n * });\n * \n * await morphGit.init({ repoId: 'my-project', dir: './my-project' });\n * await morphGit.push({ dir: './my-project' });\n * ```\n */\nexport class MorphGit {\n private readonly apiKey: string;\n private readonly proxyUrl: string;\n\n constructor(config: MorphGitConfig) {\n // Validate API key\n if (!config.apiKey) {\n throw new Error('API key is required. Get one at https://morphllm.com/dashboard');\n }\n \n if (!config.apiKey.startsWith('sk-') && !config.apiKey.startsWith('morph-')) {\n throw new Error('Invalid API key format. Expected: sk-... or morph-...');\n }\n \n this.apiKey = config.apiKey;\n this.proxyUrl = config.proxyUrl || DEFAULT_PROXY_URL;\n }\n \n /**\n * Get auth callback for isomorphic-git operations\n * @private\n */\n private getAuthCallback() {\n return () => ({\n username: 'morph',\n password: this.apiKey,\n });\n }\n\n /**\n * Initialize a new repository\n * Creates the repo in the database and in the git provider\n * \n * @example\n * ```ts\n * await morphGit.init({\n * repoId: 'my-project',\n * dir: './my-project',\n * defaultBranch: 'main'\n * });\n * ```\n */\n async init(options: {\n repoId: string;\n dir: string;\n defaultBranch?: string;\n }): Promise<void> {\n const { repoId, dir, defaultBranch = 'main' } = options;\n\n // Call backend API to create repository\n const response = await fetch(`${this.proxyUrl}/v1/repos`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repoId,\n name: repoId,\n defaultBranch,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create repository: ${error}`);\n }\n\n // Initialize local git repo\n await git.init({\n fs,\n dir,\n defaultBranch,\n });\n\n // Add remote\n await git.addRemote({\n fs,\n dir,\n remote: 'origin',\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n });\n\n console.log(`✓ Repository '${repoId}' initialized`);\n }\n\n /**\n * Clone a repository from Morph repos\n * \n * @example\n * ```ts\n * await morphGit.clone({\n * repoId: 'my-project',\n * dir: './my-project'\n * });\n * ```\n */\n async clone(options: CloneOptions): Promise<void> {\n const { repoId, dir, branch = 'main', depth, singleBranch = true } = options;\n\n await git.clone({\n fs,\n http,\n dir,\n corsProxy: this.proxyUrl,\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n ref: branch,\n singleBranch,\n depth,\n onAuth: this.getAuthCallback(),\n });\n }\n\n /**\n * Push changes to remote repository\n * \n * @example\n * ```ts\n * await morphGit.push({ dir: './my-project' });\n * ```\n */\n async push(options: PushOptions): Promise<void> {\n const { dir, remote = 'origin', branch } = options;\n\n await git.push({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n });\n }\n\n /**\n * Pull changes from remote repository\n * \n * @example\n * ```ts\n * await morphGit.pull({ dir: './my-project' });\n * ```\n */\n async pull(options: PullOptions): Promise<void> {\n const { dir, remote = 'origin', branch } = options;\n\n await git.pull({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n author: {\n name: 'Morph Agent',\n email: 'agent@morph.com',\n },\n });\n }\n\n /**\n * Stage a file for commit\n * \n * @example\n * ```ts\n * await morphGit.add({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * ```\n */\n async add(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.add({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Remove a file from staging\n * \n * @example\n * ```ts\n * await morphGit.remove({\n * dir: './my-project',\n * filepath: 'src/old-file.ts'\n * });\n * ```\n */\n async remove(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.remove({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Commit staged changes\n * \n * @example\n * ```ts\n * await morphGit.commit({\n * dir: './my-project',\n * message: 'Add new feature',\n * author: {\n * name: 'AI Agent',\n * email: 'ai@example.com'\n * },\n * chatHistory: [\n * { role: 'user', content: 'Please add a new feature' },\n * { role: 'assistant', content: 'I will add that feature' }\n * ],\n * recordingId: 'rec_123'\n * });\n * ```\n */\n async commit(options: CommitOptions): Promise<string> {\n const { dir, message, author, chatHistory, recordingId } = options;\n\n // Provide default author if not specified\n const commitAuthor = author || {\n name: 'Morph SDK',\n email: 'sdk@morphllm.com'\n };\n\n const sha = await git.commit({\n fs,\n dir,\n message,\n author: commitAuthor,\n });\n\n // Store metadata as git note if provided\n if (chatHistory || recordingId) {\n const metadata: CommitMetadata = {\n chatHistory,\n recordingId\n };\n \n await git.addNote({\n fs,\n dir,\n ref: 'refs/notes/morph-metadata',\n oid: sha,\n note: JSON.stringify(metadata, null, 2),\n author: commitAuthor\n });\n }\n\n return sha;\n }\n\n /**\n * Get status of a file\n * \n * @example\n * ```ts\n * const status = await morphGit.status({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * console.log(status); // 'modified', '*added', etc.\n * ```\n */\n async status(options: StatusOptions): Promise<string> {\n const { dir, filepath } = options;\n\n if (!filepath) {\n throw new Error('filepath is required for status check');\n }\n\n const status = await git.status({\n fs,\n dir,\n filepath,\n });\n\n return status;\n }\n\n /**\n * Get commit history\n * \n * @example\n * ```ts\n * const commits = await morphGit.log({\n * dir: './my-project',\n * depth: 10\n * });\n * ```\n */\n async log(options: LogOptions): Promise<CommitObject[]> {\n const { dir, depth, ref } = options;\n\n const commits = await git.log({\n fs,\n dir,\n depth,\n ref,\n });\n\n return commits as CommitObject[];\n }\n\n /**\n * Checkout a branch or commit\n * \n * @example\n * ```ts\n * await morphGit.checkout({\n * dir: './my-project',\n * ref: 'feature-branch'\n * });\n * ```\n */\n async checkout(options: CheckoutOptions): Promise<void> {\n const { dir, ref } = options;\n\n await git.checkout({\n fs,\n dir,\n ref,\n });\n }\n\n /**\n * Create a new branch\n * \n * @example\n * ```ts\n * await morphGit.branch({\n * dir: './my-project',\n * name: 'feature-branch',\n * checkout: true\n * });\n * ```\n */\n async branch(options: BranchOptions): Promise<void> {\n const { dir, name, checkout = false } = options;\n\n await git.branch({\n fs,\n dir,\n ref: name,\n checkout,\n });\n }\n\n /**\n * List all branches\n * \n * @example\n * ```ts\n * const branches = await morphGit.listBranches({\n * dir: './my-project'\n * });\n * ```\n */\n async listBranches(options: { dir: string }): Promise<string[]> {\n const { dir } = options;\n\n const branches = await git.listBranches({\n fs,\n dir,\n });\n\n return branches;\n }\n\n /**\n * Get the current branch name\n * \n * @example\n * ```ts\n * const branch = await morphGit.currentBranch({\n * dir: './my-project'\n * });\n * ```\n */\n async currentBranch(options: { dir: string }): Promise<string | undefined> {\n const { dir } = options;\n\n const branch = await git.currentBranch({\n fs,\n dir,\n });\n\n return branch || undefined;\n }\n\n /**\n * Get list of changed files (similar to git diff --name-only)\n * \n * @example\n * ```ts\n * const changes = await morphGit.statusMatrix({\n * dir: './my-project'\n * });\n * ```\n */\n async statusMatrix(options: { dir: string }): Promise<StatusResult[]> {\n const { dir } = options;\n\n const matrix = await git.statusMatrix({\n fs,\n dir,\n });\n\n return matrix.map(([filepath, HEADStatus, workdirStatus, stageStatus]) => {\n let status: StatusResult['status'] = 'unmodified';\n\n // Determine status based on statusMatrix values\n if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 2) {\n status = 'modified';\n } else if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 1) {\n status = '*modified';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 2) {\n status = 'added';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 0) {\n status = '*added';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 0) {\n status = 'deleted';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 1) {\n status = '*deleted';\n } else if (HEADStatus === 1 && workdirStatus === 1 && stageStatus === 1) {\n status = 'unmodified';\n } else if (HEADStatus === 0 && workdirStatus === 0 && stageStatus === 0) {\n status = 'absent';\n }\n\n return {\n filepath,\n status,\n };\n });\n }\n\n /**\n * Get the current commit hash\n * \n * @example\n * ```ts\n * const hash = await morphGit.resolveRef({\n * dir: './my-project',\n * ref: 'HEAD'\n * });\n * ```\n */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n\n const oid = await git.resolveRef({\n fs,\n dir,\n ref,\n });\n\n return oid;\n }\n\n /**\n * Get metadata (chat history, recording ID) attached to a commit\n * \n * @example\n * ```ts\n * const metadata = await morphGit.getCommitMetadata({\n * dir: './my-project',\n * commitSha: 'abc123...'\n * });\n * \n * if (metadata) {\n * console.log('Chat history:', metadata.chatHistory);\n * console.log('Recording ID:', metadata.recordingId);\n * }\n * ```\n */\n async getCommitMetadata(options: {\n dir: string;\n commitSha: string;\n }): Promise<CommitMetadata | null> {\n try {\n const note = await git.readNote({\n fs,\n dir: options.dir,\n ref: 'refs/notes/morph-metadata',\n oid: options.commitSha\n });\n \n const metadata = JSON.parse(new TextDecoder().decode(note));\n return metadata;\n } catch (err) {\n // No metadata found for this commit\n return null;\n }\n }\n}\n\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../tools/fastapply/anthropic.ts"],"sourcesContent":["/**\n * Anthropic SDK adapter for edit_file tool\n */\n\nimport type { Tool } from '@anthropic-ai/sdk/resources/messages';\nimport { executeEditFile } from './core.js';\nimport { EDIT_FILE_TOOL_DESCRIPTION, EDIT_FILE_SYSTEM_PROMPT } from './prompts.js';\nimport type { EditFileInput, EditFileResult, EditFileConfig } from './types.js';\n\n/**\n * Anthropic-native tool definition for edit_file\n * \n * @example\n * ```ts\n * import Anthropic from '@anthropic-ai/sdk';\n * import { editFileTool } from 'morphsdk/tools/anthropic';\n * \n * const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });\n * \n * const response = await client.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * tools: [editFileTool],\n * messages: [{ role: \"user\", content: \"Fix the bug in app.ts\" }]\n * });\n * ```\n */\nexport const editFileTool: Tool = {\n name: 'edit_file',\n description: EDIT_FILE_TOOL_DESCRIPTION,\n input_schema: {\n type: 'object',\n properties: {\n target_filepath: {\n type: 'string',\n description: 'The path of the target file to modify',\n },\n instructions: {\n type: 'string',\n description: 'A single sentence describing what you are changing (first person)',\n },\n code_edit: {\n type: 'string',\n description: 'The lazy edit with // ... existing code ... markers',\n },\n },\n required: ['target_filepath', 'instructions', 'code_edit'],\n },\n};\n\n/**\n * Format the result for passing back to Claude\n * \n * @param result - The edit result\n * @returns Formatted string for tool_result\n */\nfunction formatResult(result: EditFileResult): string {\n if (!result.success) {\n return `Error editing file: ${result.error}`;\n }\n \n const { changes } = result;\n const summary = [\n changes.linesAdded && `+${changes.linesAdded} lines`,\n changes.linesRemoved && `-${changes.linesRemoved} lines`,\n changes.linesModified && `~${changes.linesModified} lines modified`,\n ]\n .filter(Boolean)\n .join(', ');\n \n if (result.udiff) {\n return `Successfully applied changes to ${result.filepath}:\\n\\n${result.udiff}\\n\\nSummary: ${summary}`;\n }\n \n return `Successfully applied changes to ${result.filepath}. ${summary}`;\n}\n\n/**\n * Create a custom edit_file tool with configuration\n * \n * @param config - Configuration options\n * @returns Tool definition with execute and formatResult methods\n * \n * @example\n * ```ts\n * const tool = createEditFileTool({\n * baseDir: './src',\n * generateUdiff: true,\n * morphApiKey: 'sk-...',\n * description: 'Custom tool description for your use case'\n * });\n * \n * // Use as Anthropic tool\n * const response = await client.messages.create({\n * tools: [tool], // tool itself is the Tool definition\n * ...\n * });\n * \n * // Execute and format\n * const result = await tool.execute(toolUseBlock.input);\n * const formatted = tool.formatResult(result);\n * ```\n */\nexport function createEditFileTool(config: EditFileConfig = {}) {\n const toolDef: Tool = {\n ...editFileTool,\n ...(config.description && { description: config.description }),\n };\n \n return Object.assign({}, toolDef, {\n execute: async (input: EditFileInput): Promise<EditFileResult> => {\n return executeEditFile(input, config);\n },\n formatResult: (result: EditFileResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return EDIT_FILE_SYSTEM_PROMPT;\n },\n });\n}\n\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BO,IAAM,eAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,MACV,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,mBAAmB,gBAAgB,WAAW;AAAA,EAC3D;AACF;AAQA,SAAS,aAAa,QAAgC;AACpD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,uBAAuB,OAAO,KAAK;AAAA,EAC5C;AAEA,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,UAAU;AAAA,IACd,QAAQ,cAAc,IAAI,QAAQ,UAAU;AAAA,IAC5C,QAAQ,gBAAgB,IAAI,QAAQ,YAAY;AAAA,IAChD,QAAQ,iBAAiB,IAAI,QAAQ,aAAa;AAAA,EACpD,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,MAAI,OAAO,OAAO;AAChB,WAAO,mCAAmC,OAAO,QAAQ;AAAA;AAAA,EAAQ,OAAO,KAAK;AAAA;AAAA,WAAgB,OAAO;AAAA,EACtG;AAEA,SAAO,mCAAmC,OAAO,QAAQ,KAAK,OAAO;AACvE;AA4BO,SAAS,mBAAmB,SAAyB,CAAC,GAAG;AAC9D,QAAM,UAAgB;AAAA,IACpB,GAAG;AAAA,IACH,GAAI,OAAO,eAAe,EAAE,aAAa,OAAO,YAAY;AAAA,EAC9D;AAEA,SAAO,OAAO,OAAO,CAAC,GAAG,SAAS;AAAA,IAChC,SAAS,OAAO,UAAkD;AAChE,aAAO,gBAAgB,OAAO,MAAM;AAAA,IACtC;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":[]}