@struktoai/mirage-agents 0.0.3-alpha.0 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/chunk-IMI7BLEG.js +142 -0
- package/dist/chunk-IMI7BLEG.js.map +1 -0
- package/dist/{chunk-KAHWIK63.js → chunk-ODKR5YZI.js} +3 -5
- package/dist/chunk-ODKR5YZI.js.map +1 -0
- package/dist/chunk-OLFSAPC6.js +139 -0
- package/dist/chunk-OLFSAPC6.js.map +1 -0
- package/dist/chunk-XEQB7N3F.js +79 -0
- package/dist/chunk-XEQB7N3F.js.map +1 -0
- package/dist/claude-agent-sdk/index.d.ts +15 -0
- package/dist/claude-agent-sdk/index.js +91 -0
- package/dist/claude-agent-sdk/index.js.map +1 -0
- package/dist/file-version-Clij-pms.d.ts +22 -0
- package/dist/langchain/index.d.ts +1 -1
- package/dist/langchain/index.js +1 -1
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.js +100 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/openai/index.d.ts +14 -3
- package/dist/openai/index.js +82 -2
- package/dist/openai/index.js.map +1 -1
- package/dist/opencode/index.d.ts +8 -18
- package/dist/opencode/index.js +66 -67
- package/dist/opencode/index.js.map +1 -1
- package/dist/pi/index.d.ts +13 -8
- package/dist/pi/index.js +66 -37
- package/dist/pi/index.js.map +1 -1
- package/dist/prompt-Ca4hc1Ul.d.ts +11 -0
- package/dist/tool-descriptions-7CgIovZc.d.ts +33 -0
- package/dist/vercel/index.d.ts +3 -67
- package/dist/vercel/index.js +28 -102
- package/dist/vercel/index.js.map +1 -1
- package/package.json +56 -17
- package/dist/chunk-KAHWIK63.js.map +0 -1
- package/dist/prompt-CbBVJuUY.d.ts +0 -11
package/dist/langchain/index.js
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Workspace } from '@struktoai/mirage-core';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { M as MirageToolOperationsOptions } from '../tool-descriptions-7CgIovZc.js';
|
|
4
|
+
export { E as EDIT_DESCRIPTION, a as EXECUTE_DESCRIPTION, G as GREP_DESCRIPTION, L as LS_DESCRIPTION, b as MirageToolOperations, R as READ_DESCRIPTION, T as ToolResult, W as WRITE_DESCRIPTION } from '../tool-descriptions-7CgIovZc.js';
|
|
5
|
+
export { F as FileVersionTracker, S as StaleMirageFileError } from '../file-version-Clij-pms.js';
|
|
6
|
+
|
|
7
|
+
interface MirageMcpServerOptions extends MirageToolOperationsOptions {
|
|
8
|
+
name?: string;
|
|
9
|
+
version?: string;
|
|
10
|
+
}
|
|
11
|
+
declare function createMirageMcpServer(workspace: Workspace, options?: MirageMcpServerOptions): McpServer;
|
|
12
|
+
declare function serveMirageMcp(workspace: Workspace, options?: MirageMcpServerOptions): Promise<McpServer>;
|
|
13
|
+
|
|
14
|
+
export { type MirageMcpServerOptions, MirageToolOperationsOptions, createMirageMcpServer, serveMirageMcp };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EDIT_DESCRIPTION,
|
|
3
|
+
EXECUTE_DESCRIPTION,
|
|
4
|
+
GREP_DESCRIPTION,
|
|
5
|
+
LS_DESCRIPTION,
|
|
6
|
+
MirageToolOperations,
|
|
7
|
+
READ_DESCRIPTION,
|
|
8
|
+
WRITE_DESCRIPTION
|
|
9
|
+
} from "../chunk-OLFSAPC6.js";
|
|
10
|
+
import {
|
|
11
|
+
FileVersionTracker,
|
|
12
|
+
StaleMirageFileError
|
|
13
|
+
} from "../chunk-XEQB7N3F.js";
|
|
14
|
+
|
|
15
|
+
// src/mcp/server.ts
|
|
16
|
+
import { VERSION } from "@struktoai/mirage-core";
|
|
17
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
18
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
function createMirageMcpServer(workspace, options = {}) {
|
|
21
|
+
const operations = new MirageToolOperations(workspace, options);
|
|
22
|
+
const server = new McpServer({
|
|
23
|
+
name: options.name ?? "mirage",
|
|
24
|
+
version: options.version ?? VERSION
|
|
25
|
+
});
|
|
26
|
+
server.registerTool(
|
|
27
|
+
"execute_command",
|
|
28
|
+
{ description: EXECUTE_DESCRIPTION, inputSchema: { command: z.string() } },
|
|
29
|
+
(args) => operations.execute(args.command)
|
|
30
|
+
);
|
|
31
|
+
server.registerTool(
|
|
32
|
+
"read",
|
|
33
|
+
{
|
|
34
|
+
description: READ_DESCRIPTION,
|
|
35
|
+
inputSchema: {
|
|
36
|
+
path: z.string(),
|
|
37
|
+
offset: z.number().int().min(0).optional(),
|
|
38
|
+
limit: z.number().int().min(1).optional()
|
|
39
|
+
},
|
|
40
|
+
annotations: { readOnlyHint: true }
|
|
41
|
+
},
|
|
42
|
+
(args) => operations.read(args.path, args.offset, args.limit)
|
|
43
|
+
);
|
|
44
|
+
server.registerTool(
|
|
45
|
+
"write",
|
|
46
|
+
{ description: WRITE_DESCRIPTION, inputSchema: { path: z.string(), content: z.string() } },
|
|
47
|
+
(args) => operations.write(args.path, args.content)
|
|
48
|
+
);
|
|
49
|
+
server.registerTool(
|
|
50
|
+
"edit",
|
|
51
|
+
{
|
|
52
|
+
description: EDIT_DESCRIPTION,
|
|
53
|
+
inputSchema: {
|
|
54
|
+
path: z.string(),
|
|
55
|
+
old_string: z.string(),
|
|
56
|
+
new_string: z.string(),
|
|
57
|
+
replace_all: z.boolean().optional()
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
(args) => operations.edit(args.path, args.old_string, args.new_string, args.replace_all)
|
|
61
|
+
);
|
|
62
|
+
server.registerTool(
|
|
63
|
+
"ls",
|
|
64
|
+
{
|
|
65
|
+
description: LS_DESCRIPTION,
|
|
66
|
+
inputSchema: { path: z.string() },
|
|
67
|
+
annotations: { readOnlyHint: true }
|
|
68
|
+
},
|
|
69
|
+
(args) => operations.ls(args.path)
|
|
70
|
+
);
|
|
71
|
+
server.registerTool(
|
|
72
|
+
"grep",
|
|
73
|
+
{
|
|
74
|
+
description: GREP_DESCRIPTION,
|
|
75
|
+
inputSchema: { pattern: z.string(), path: z.string() },
|
|
76
|
+
annotations: { readOnlyHint: true }
|
|
77
|
+
},
|
|
78
|
+
(args) => operations.grep(args.pattern, args.path)
|
|
79
|
+
);
|
|
80
|
+
return server;
|
|
81
|
+
}
|
|
82
|
+
async function serveMirageMcp(workspace, options = {}) {
|
|
83
|
+
const server = createMirageMcpServer(workspace, options);
|
|
84
|
+
await server.connect(new StdioServerTransport());
|
|
85
|
+
return server;
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
EDIT_DESCRIPTION,
|
|
89
|
+
EXECUTE_DESCRIPTION,
|
|
90
|
+
FileVersionTracker,
|
|
91
|
+
GREP_DESCRIPTION,
|
|
92
|
+
LS_DESCRIPTION,
|
|
93
|
+
MirageToolOperations,
|
|
94
|
+
READ_DESCRIPTION,
|
|
95
|
+
StaleMirageFileError,
|
|
96
|
+
WRITE_DESCRIPTION,
|
|
97
|
+
createMirageMcpServer,
|
|
98
|
+
serveMirageMcp
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/server.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { VERSION } from '@struktoai/mirage-core'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport {\n EDIT_DESCRIPTION,\n EXECUTE_DESCRIPTION,\n GREP_DESCRIPTION,\n LS_DESCRIPTION,\n READ_DESCRIPTION,\n WRITE_DESCRIPTION,\n} from '../tool-descriptions.ts'\nimport { MirageToolOperations, type MirageToolOperationsOptions } from '../tool-operations.ts'\n\nexport interface MirageMcpServerOptions extends MirageToolOperationsOptions {\n name?: string\n version?: string\n}\n\nexport function createMirageMcpServer(\n workspace: Workspace,\n options: MirageMcpServerOptions = {},\n): McpServer {\n const operations = new MirageToolOperations(workspace, options)\n const server = new McpServer({\n name: options.name ?? 'mirage',\n version: options.version ?? VERSION,\n })\n\n server.registerTool(\n 'execute_command',\n { description: EXECUTE_DESCRIPTION, inputSchema: { command: z.string() } },\n (args) => operations.execute(args.command),\n )\n server.registerTool(\n 'read',\n {\n description: READ_DESCRIPTION,\n inputSchema: {\n path: z.string(),\n offset: z.number().int().min(0).optional(),\n limit: z.number().int().min(1).optional(),\n },\n annotations: { readOnlyHint: true },\n },\n (args) => operations.read(args.path, args.offset, args.limit),\n )\n server.registerTool(\n 'write',\n { description: WRITE_DESCRIPTION, inputSchema: { path: z.string(), content: z.string() } },\n (args) => operations.write(args.path, args.content),\n )\n server.registerTool(\n 'edit',\n {\n description: EDIT_DESCRIPTION,\n inputSchema: {\n path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n },\n },\n (args) => operations.edit(args.path, args.old_string, args.new_string, args.replace_all),\n )\n server.registerTool(\n 'ls',\n {\n description: LS_DESCRIPTION,\n inputSchema: { path: z.string() },\n annotations: { readOnlyHint: true },\n },\n (args) => operations.ls(args.path),\n )\n server.registerTool(\n 'grep',\n {\n description: GREP_DESCRIPTION,\n inputSchema: { pattern: z.string(), path: z.string() },\n annotations: { readOnlyHint: true },\n },\n (args) => operations.grep(args.pattern, args.path),\n )\n\n return server\n}\n\nexport async function serveMirageMcp(\n workspace: Workspace,\n options: MirageMcpServerOptions = {},\n): Promise<McpServer> {\n const server = createMirageMcpServer(workspace, options)\n await server.connect(new StdioServerTransport())\n return server\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;AAgBX,SAAS,sBACd,WACA,UAAkC,CAAC,GACxB;AACX,QAAM,aAAa,IAAI,qBAAqB,WAAW,OAAO;AAC9D,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,EAAE,aAAa,qBAAqB,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,IACzE,CAAC,SAAS,WAAW,QAAQ,KAAK,OAAO;AAAA,EAC3C;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO;AAAA,QACf,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAC1C;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,CAAC,SAAS,WAAW,KAAK,KAAK,MAAM,KAAK,QAAQ,KAAK,KAAK;AAAA,EAC9D;AACA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,aAAa,mBAAmB,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,IACzF,CAAC,SAAS,WAAW,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,EACpD;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO;AAAA,QACf,YAAY,EAAE,OAAO;AAAA,QACrB,YAAY,EAAE,OAAO;AAAA,QACrB,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,MACpC;AAAA,IACF;AAAA,IACA,CAAC,SAAS,WAAW,KAAK,KAAK,MAAM,KAAK,YAAY,KAAK,YAAY,KAAK,WAAW;AAAA,EACzF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;AAAA,MAChC,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,CAAC,SAAS,WAAW,GAAG,KAAK,IAAI;AAAA,EACnC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE;AAAA,MACrD,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,CAAC,SAAS,WAAW,KAAK,KAAK,SAAS,KAAK,IAAI;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,eAAsB,eACpB,WACA,UAAkC,CAAC,GACf;AACpB,QAAM,SAAS,sBAAsB,WAAW,OAAO;AACvD,QAAM,OAAO,QAAQ,IAAI,qBAAqB,CAAC;AAC/C,SAAO;AACT;","names":[]}
|
package/dist/openai/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Workspace } from '@struktoai/mirage-core';
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import * as _openai_agents from '@openai/agents';
|
|
3
|
+
import { Editor, ApplyPatchOperation, ApplyPatchResult, ToolOutputText, ToolOutputImage, ToolOutputFileContent, Shell, ShellAction, ShellResult } from '@openai/agents';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export { B as BuildSystemPromptOptions, M as MIRAGE_SYSTEM_PROMPT, b as buildSystemPrompt } from '../prompt-Ca4hc1Ul.js';
|
|
4
6
|
|
|
5
7
|
declare class MirageEditor implements Editor {
|
|
6
8
|
private readonly ws;
|
|
@@ -16,10 +18,19 @@ declare class MirageEditor implements Editor {
|
|
|
16
18
|
}>): Promise<ApplyPatchResult>;
|
|
17
19
|
}
|
|
18
20
|
|
|
21
|
+
declare function mirageExecuteTool(ws: Workspace): _openai_agents.FunctionTool<unknown, z.ZodObject<{
|
|
22
|
+
command: z.ZodString;
|
|
23
|
+
}, z.core.$strip>, string>;
|
|
24
|
+
|
|
25
|
+
type MirageReadFileOutput = ToolOutputText | ToolOutputImage | ToolOutputFileContent;
|
|
26
|
+
declare function mirageReadFileTool(ws: Workspace): _openai_agents.FunctionTool<unknown, z.ZodObject<{
|
|
27
|
+
path: z.ZodString;
|
|
28
|
+
}, z.core.$strip>, string>;
|
|
29
|
+
|
|
19
30
|
declare class MirageShell implements Shell {
|
|
20
31
|
private readonly ws;
|
|
21
32
|
constructor(ws: Workspace);
|
|
22
33
|
run(action: ShellAction): Promise<ShellResult>;
|
|
23
34
|
}
|
|
24
35
|
|
|
25
|
-
export { MirageEditor, MirageShell };
|
|
36
|
+
export { MirageEditor, type MirageReadFileOutput, MirageShell, mirageExecuteTool, mirageReadFileTool };
|
package/dist/openai/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MIRAGE_SYSTEM_PROMPT,
|
|
3
3
|
buildSystemPrompt
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-ODKR5YZI.js";
|
|
5
|
+
import {
|
|
6
|
+
readWorkspaceFile
|
|
7
|
+
} from "../chunk-IMI7BLEG.js";
|
|
5
8
|
|
|
6
9
|
// src/openai/editor.ts
|
|
7
10
|
import { applyDiff } from "@openai/agents";
|
|
@@ -48,6 +51,81 @@ var MirageEditor = class {
|
|
|
48
51
|
}
|
|
49
52
|
};
|
|
50
53
|
|
|
54
|
+
// src/openai/execute.ts
|
|
55
|
+
import { tool } from "@openai/agents";
|
|
56
|
+
import { z } from "zod";
|
|
57
|
+
function formatExecuteOutput(stdout, stderr, exitCode) {
|
|
58
|
+
const sections = [`exit code: ${String(exitCode)}`];
|
|
59
|
+
if (stdout !== "") sections.push(`stdout:
|
|
60
|
+
${stdout}`);
|
|
61
|
+
if (stderr !== "") sections.push(`stderr:
|
|
62
|
+
${stderr}`);
|
|
63
|
+
return sections.join("\n");
|
|
64
|
+
}
|
|
65
|
+
async function executeOutput(ws, command) {
|
|
66
|
+
try {
|
|
67
|
+
const result = await ws.execute(command);
|
|
68
|
+
return formatExecuteOutput(result.stdoutText, result.stderrText, result.exitCode);
|
|
69
|
+
} catch (error) {
|
|
70
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
71
|
+
return `Unable to execute command: ${message}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function mirageExecuteTool(ws) {
|
|
75
|
+
return tool({
|
|
76
|
+
name: "execute",
|
|
77
|
+
description: "Execute a shell command inside the Mirage workspace and return its stdout, stderr, and exit code.",
|
|
78
|
+
parameters: z.object({
|
|
79
|
+
command: z.string().describe("Shell command to execute inside the Mirage workspace.")
|
|
80
|
+
}),
|
|
81
|
+
execute: async ({ command }) => executeOutput(ws, command)
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/openai/read-file.ts
|
|
86
|
+
import {
|
|
87
|
+
tool as tool2
|
|
88
|
+
} from "@openai/agents";
|
|
89
|
+
import { z as z2 } from "zod";
|
|
90
|
+
async function readFileOutput(ws, path) {
|
|
91
|
+
try {
|
|
92
|
+
const result = await readWorkspaceFile(ws, path);
|
|
93
|
+
if (result.kind === "text") {
|
|
94
|
+
return { type: "text", text: result.content };
|
|
95
|
+
}
|
|
96
|
+
if (result.kind === "image") {
|
|
97
|
+
return {
|
|
98
|
+
type: "image",
|
|
99
|
+
image: { data: Uint8Array.from(result.data), mediaType: result.mimeType }
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (result.kind === "file") {
|
|
103
|
+
return {
|
|
104
|
+
type: "file",
|
|
105
|
+
file: {
|
|
106
|
+
data: Uint8Array.from(result.data),
|
|
107
|
+
mediaType: result.mimeType,
|
|
108
|
+
filename: result.filename
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return { type: "text", text: result.note };
|
|
113
|
+
} catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
+
return { type: "text", text: `Unable to read ${path}: ${message}` };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function mirageReadFileTool(ws) {
|
|
119
|
+
return tool2({
|
|
120
|
+
name: "read_file",
|
|
121
|
+
description: "Read a file from the Mirage workspace. Returns UTF-8 text directly, images as model-visible image input, PDFs as model-visible file input, and a metadata description for other binary formats.",
|
|
122
|
+
parameters: z2.object({
|
|
123
|
+
path: z2.string().describe("Absolute path inside the Mirage workspace.")
|
|
124
|
+
}),
|
|
125
|
+
execute: async ({ path }) => readFileOutput(ws, path)
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
51
129
|
// src/openai/shell.ts
|
|
52
130
|
var MirageShell = class {
|
|
53
131
|
constructor(ws) {
|
|
@@ -71,6 +149,8 @@ export {
|
|
|
71
149
|
MIRAGE_SYSTEM_PROMPT,
|
|
72
150
|
MirageEditor,
|
|
73
151
|
MirageShell,
|
|
74
|
-
buildSystemPrompt
|
|
152
|
+
buildSystemPrompt,
|
|
153
|
+
mirageExecuteTool,
|
|
154
|
+
mirageReadFileTool
|
|
75
155
|
};
|
|
76
156
|
//# sourceMappingURL=index.js.map
|
package/dist/openai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/openai/editor.ts","../../src/openai/shell.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { applyDiff } from '@openai/agents'\nimport type { ApplyPatchOperation, ApplyPatchResult, Editor } from '@openai/agents'\nimport { gnuDirname } from '@struktoai/mirage-core'\n\nasync function ensureParent(ws: Workspace, path: string): Promise<void> {\n const parent = gnuDirname(path)\n if (parent === '/' || parent === '' || parent === '.') return\n if (await ws.fs.exists(parent)) return\n await ensureParent(ws, parent)\n try {\n await ws.fs.mkdir(parent)\n } catch (err) {\n // Tolerate mkdir race: another caller may have created the dir between exists() and mkdir().\n if (!(await ws.fs.exists(parent))) throw err\n }\n}\n\nexport class MirageEditor implements Editor {\n constructor(private readonly ws: Workspace) {}\n\n async createFile(\n op: Extract<ApplyPatchOperation, { type: 'create_file' }>,\n ): Promise<ApplyPatchResult> {\n await ensureParent(this.ws, op.path)\n const content = applyDiff('', op.diff, 'create')\n await this.ws.fs.writeFile(op.path, content)\n return { status: 'completed' }\n }\n\n async updateFile(\n op: Extract<ApplyPatchOperation, { type: 'update_file' }>,\n ): Promise<ApplyPatchResult> {\n let current: string\n try {\n current = await this.ws.fs.readFileText(op.path)\n } catch {\n return { status: 'failed', output: `File not found: ${op.path}` }\n }\n const next = applyDiff(current, op.diff)\n await this.ws.fs.writeFile(op.path, next)\n return { status: 'completed' }\n }\n\n async deleteFile(\n op: Extract<ApplyPatchOperation, { type: 'delete_file' }>,\n ): Promise<ApplyPatchResult> {\n if (!(await this.ws.fs.exists(op.path))) {\n return { status: 'failed', output: `File not found: ${op.path}` }\n }\n await this.ws.fs.unlink(op.path)\n return { status: 'completed' }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport type { Shell, ShellAction, ShellResult, ShellOutputResult } from '@openai/agents'\n\nexport class MirageShell implements Shell {\n constructor(private readonly ws: Workspace) {}\n\n async run(action: ShellAction): Promise<ShellResult> {\n const output: ShellOutputResult[] = []\n for (const cmd of action.commands) {\n const io = await this.ws.execute(cmd)\n output.push({\n stdout: io.stdoutText,\n stderr: io.stderrText,\n outcome: { type: 'exit', exitCode: io.exitCode },\n })\n }\n return { output }\n }\n}\n"],"mappings":";;;;;;AAeA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAE3B,eAAe,aAAa,IAAe,MAA6B;AACtE,QAAM,SAAS,WAAW,IAAI;AAC9B,MAAI,WAAW,OAAO,WAAW,MAAM,WAAW,IAAK;AACvD,MAAI,MAAM,GAAG,GAAG,OAAO,MAAM,EAAG;AAChC,QAAM,aAAa,IAAI,MAAM;AAC7B,MAAI;AACF,UAAM,GAAG,GAAG,MAAM,MAAM;AAAA,EAC1B,SAAS,KAAK;AAEZ,QAAI,CAAE,MAAM,GAAG,GAAG,OAAO,MAAM,EAAI,OAAM;AAAA,EAC3C;AACF;AAEO,IAAM,eAAN,MAAqC;AAAA,EAC1C,YAA6B,IAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA,EAE7B,MAAM,WACJ,IAC2B;AAC3B,UAAM,aAAa,KAAK,IAAI,GAAG,IAAI;AACnC,UAAM,UAAU,UAAU,IAAI,GAAG,MAAM,QAAQ;AAC/C,UAAM,KAAK,GAAG,GAAG,UAAU,GAAG,MAAM,OAAO;AAC3C,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,WACJ,IAC2B;AAC3B,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,KAAK,GAAG,GAAG,aAAa,GAAG,IAAI;AAAA,IACjD,QAAQ;AACN,aAAO,EAAE,QAAQ,UAAU,QAAQ,mBAAmB,GAAG,IAAI,GAAG;AAAA,IAClE;AACA,UAAM,OAAO,UAAU,SAAS,GAAG,IAAI;AACvC,UAAM,KAAK,GAAG,GAAG,UAAU,GAAG,MAAM,IAAI;AACxC,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,WACJ,IAC2B;AAC3B,QAAI,CAAE,MAAM,KAAK,GAAG,GAAG,OAAO,GAAG,IAAI,GAAI;AACvC,aAAO,EAAE,QAAQ,UAAU,QAAQ,mBAAmB,GAAG,IAAI,GAAG;AAAA,IAClE;AACA,UAAM,KAAK,GAAG,GAAG,OAAO,GAAG,IAAI;AAC/B,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC/B;AACF;;;AClDO,IAAM,cAAN,MAAmC;AAAA,EACxC,YAA6B,IAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA,EAE7B,MAAM,IAAI,QAA2C;AACnD,UAAM,SAA8B,CAAC;AACrC,eAAW,OAAO,OAAO,UAAU;AACjC,YAAM,KAAK,MAAM,KAAK,GAAG,QAAQ,GAAG;AACpC,aAAO,KAAK;AAAA,QACV,QAAQ,GAAG;AAAA,QACX,QAAQ,GAAG;AAAA,QACX,SAAS,EAAE,MAAM,QAAQ,UAAU,GAAG,SAAS;AAAA,MACjD,CAAC;AAAA,IACH;AACA,WAAO,EAAE,OAAO;AAAA,EAClB;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/openai/editor.ts","../../src/openai/execute.ts","../../src/openai/read-file.ts","../../src/openai/shell.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { applyDiff } from '@openai/agents'\nimport type { ApplyPatchOperation, ApplyPatchResult, Editor } from '@openai/agents'\nimport { gnuDirname } from '@struktoai/mirage-core'\n\nasync function ensureParent(ws: Workspace, path: string): Promise<void> {\n const parent = gnuDirname(path)\n if (parent === '/' || parent === '' || parent === '.') return\n if (await ws.fs.exists(parent)) return\n await ensureParent(ws, parent)\n try {\n await ws.fs.mkdir(parent)\n } catch (err) {\n // Tolerate mkdir race: another caller may have created the dir between exists() and mkdir().\n if (!(await ws.fs.exists(parent))) throw err\n }\n}\n\nexport class MirageEditor implements Editor {\n constructor(private readonly ws: Workspace) {}\n\n async createFile(\n op: Extract<ApplyPatchOperation, { type: 'create_file' }>,\n ): Promise<ApplyPatchResult> {\n await ensureParent(this.ws, op.path)\n const content = applyDiff('', op.diff, 'create')\n await this.ws.fs.writeFile(op.path, content)\n return { status: 'completed' }\n }\n\n async updateFile(\n op: Extract<ApplyPatchOperation, { type: 'update_file' }>,\n ): Promise<ApplyPatchResult> {\n let current: string\n try {\n current = await this.ws.fs.readFileText(op.path)\n } catch {\n return { status: 'failed', output: `File not found: ${op.path}` }\n }\n const next = applyDiff(current, op.diff)\n await this.ws.fs.writeFile(op.path, next)\n return { status: 'completed' }\n }\n\n async deleteFile(\n op: Extract<ApplyPatchOperation, { type: 'delete_file' }>,\n ): Promise<ApplyPatchResult> {\n if (!(await this.ws.fs.exists(op.path))) {\n return { status: 'failed', output: `File not found: ${op.path}` }\n }\n await this.ws.fs.unlink(op.path)\n return { status: 'completed' }\n }\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport { tool } from '@openai/agents'\nimport { z } from 'zod'\n\nfunction formatExecuteOutput(stdout: string, stderr: string, exitCode: number): string {\n const sections = [`exit code: ${String(exitCode)}`]\n if (stdout !== '') sections.push(`stdout:\\n${stdout}`)\n if (stderr !== '') sections.push(`stderr:\\n${stderr}`)\n return sections.join('\\n')\n}\n\nasync function executeOutput(ws: Workspace, command: string): Promise<string> {\n try {\n const result = await ws.execute(command)\n return formatExecuteOutput(result.stdoutText, result.stderrText, result.exitCode)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return `Unable to execute command: ${message}`\n }\n}\n\nexport function mirageExecuteTool(ws: Workspace) {\n return tool({\n name: 'execute',\n description:\n 'Execute a shell command inside the Mirage workspace and return its stdout, stderr, and exit code.',\n parameters: z.object({\n command: z.string().describe('Shell command to execute inside the Mirage workspace.'),\n }),\n execute: async ({ command }) => executeOutput(ws, command),\n })\n}\n","import type { Workspace } from '@struktoai/mirage-core'\nimport {\n tool,\n type ToolOutputFileContent,\n type ToolOutputImage,\n type ToolOutputText,\n} from '@openai/agents'\nimport { z } from 'zod'\nimport { readWorkspaceFile } from '../read-file.ts'\n\nexport type MirageReadFileOutput = ToolOutputText | ToolOutputImage | ToolOutputFileContent\n\nasync function readFileOutput(ws: Workspace, path: string): Promise<MirageReadFileOutput> {\n try {\n const result = await readWorkspaceFile(ws, path)\n if (result.kind === 'text') {\n return { type: 'text', text: result.content }\n }\n if (result.kind === 'image') {\n return {\n type: 'image',\n image: { data: Uint8Array.from(result.data), mediaType: result.mimeType },\n }\n }\n if (result.kind === 'file') {\n return {\n type: 'file',\n file: {\n data: Uint8Array.from(result.data),\n mediaType: result.mimeType,\n filename: result.filename,\n },\n }\n }\n return { type: 'text', text: result.note }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return { type: 'text', text: `Unable to read ${path}: ${message}` }\n }\n}\n\nexport function mirageReadFileTool(ws: Workspace) {\n return tool({\n name: 'read_file',\n description:\n 'Read a file from the Mirage workspace. Returns UTF-8 text directly, images as model-visible image input, PDFs as model-visible file input, and a metadata description for other binary formats.',\n parameters: z.object({\n path: z.string().describe('Absolute path inside the Mirage workspace.'),\n }),\n execute: async ({ path }) => readFileOutput(ws, path),\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-core'\nimport type { Shell, ShellAction, ShellResult, ShellOutputResult } from '@openai/agents'\n\nexport class MirageShell implements Shell {\n constructor(private readonly ws: Workspace) {}\n\n async run(action: ShellAction): Promise<ShellResult> {\n const output: ShellOutputResult[] = []\n for (const cmd of action.commands) {\n const io = await this.ws.execute(cmd)\n output.push({\n stdout: io.stdoutText,\n stderr: io.stderrText,\n outcome: { type: 'exit', exitCode: io.exitCode },\n })\n }\n return { output }\n }\n}\n"],"mappings":"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","names":["tool","z","tool","z"]}
|
package/dist/opencode/index.d.ts
CHANGED
|
@@ -1,24 +1,14 @@
|
|
|
1
|
+
import { ToolContext, Plugin, ToolDefinition } from '@opencode-ai/plugin';
|
|
1
2
|
import { Workspace } from '@struktoai/mirage-node';
|
|
2
|
-
|
|
3
|
+
export { S as StaleMirageFileError } from '../file-version-Clij-pms.js';
|
|
4
|
+
import '@struktoai/mirage-core';
|
|
3
5
|
|
|
4
|
-
interface ToolContext {
|
|
5
|
-
sessionID: string;
|
|
6
|
-
messageID: string;
|
|
7
|
-
agent: string;
|
|
8
|
-
abort: AbortSignal;
|
|
9
|
-
}
|
|
10
6
|
type WsResolver = (ctx: ToolContext) => Workspace | Promise<Workspace>;
|
|
11
7
|
type WsLike = Workspace | WsResolver;
|
|
12
|
-
interface
|
|
13
|
-
|
|
14
|
-
args: Args;
|
|
15
|
-
execute(args: z.infer<z.ZodObject<Args>>, context: ToolContext): Promise<string>;
|
|
16
|
-
}
|
|
17
|
-
declare function mirageTools(ws: WsLike): Record<string, ToolDefinition>;
|
|
18
|
-
interface Hooks {
|
|
19
|
-
tool?: Record<string, ToolDefinition>;
|
|
8
|
+
interface MirageOpenCodeOptions {
|
|
9
|
+
staleWriteProtection?: boolean;
|
|
20
10
|
}
|
|
21
|
-
|
|
22
|
-
declare function miragePlugin(ws: WsLike):
|
|
11
|
+
declare function mirageTools(ws: WsLike, options?: MirageOpenCodeOptions): Record<string, ToolDefinition>;
|
|
12
|
+
declare function miragePlugin(ws: WsLike, options?: MirageOpenCodeOptions): Plugin;
|
|
23
13
|
|
|
24
|
-
export { type
|
|
14
|
+
export { type MirageOpenCodeOptions, type WsLike, type WsResolver, miragePlugin, mirageTools };
|
package/dist/opencode/index.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readWorkspaceFile
|
|
3
|
+
} from "../chunk-IMI7BLEG.js";
|
|
4
|
+
import {
|
|
5
|
+
FileVersionTracker,
|
|
6
|
+
StaleMirageFileError
|
|
7
|
+
} from "../chunk-XEQB7N3F.js";
|
|
8
|
+
|
|
1
9
|
// src/opencode/index.ts
|
|
2
|
-
import {
|
|
3
|
-
import { gnuDirname } from "@struktoai/mirage-core";
|
|
4
|
-
|
|
5
|
-
return input;
|
|
6
|
-
}
|
|
10
|
+
import { tool } from "@opencode-ai/plugin";
|
|
11
|
+
import { encodeBase64, gnuDirname } from "@struktoai/mirage-core";
|
|
12
|
+
var z = tool.schema;
|
|
7
13
|
function isResolver(ws) {
|
|
8
14
|
return typeof ws === "function";
|
|
9
15
|
}
|
|
@@ -21,73 +27,54 @@ async function ensureParent(ws, path) {
|
|
|
21
27
|
if (!await ws.fs.exists(parent)) throw err;
|
|
22
28
|
}
|
|
23
29
|
}
|
|
24
|
-
var TEXT_EXTS = /* @__PURE__ */ new Set([
|
|
25
|
-
"txt",
|
|
26
|
-
"md",
|
|
27
|
-
"json",
|
|
28
|
-
"jsonl",
|
|
29
|
-
"yaml",
|
|
30
|
-
"yml",
|
|
31
|
-
"csv",
|
|
32
|
-
"tsv",
|
|
33
|
-
"xml",
|
|
34
|
-
"html",
|
|
35
|
-
"htm",
|
|
36
|
-
"js",
|
|
37
|
-
"mjs",
|
|
38
|
-
"cjs",
|
|
39
|
-
"ts",
|
|
40
|
-
"tsx",
|
|
41
|
-
"jsx",
|
|
42
|
-
"py",
|
|
43
|
-
"rb",
|
|
44
|
-
"rs",
|
|
45
|
-
"go",
|
|
46
|
-
"java",
|
|
47
|
-
"c",
|
|
48
|
-
"cpp",
|
|
49
|
-
"h",
|
|
50
|
-
"hpp",
|
|
51
|
-
"sh",
|
|
52
|
-
"bash",
|
|
53
|
-
"zsh",
|
|
54
|
-
"sql",
|
|
55
|
-
"log",
|
|
56
|
-
"env",
|
|
57
|
-
"ini",
|
|
58
|
-
"toml",
|
|
59
|
-
"conf",
|
|
60
|
-
"cfg"
|
|
61
|
-
]);
|
|
62
|
-
function extOf(path) {
|
|
63
|
-
const dot = path.lastIndexOf(".");
|
|
64
|
-
if (dot < 0) return "";
|
|
65
|
-
return path.slice(dot + 1).toLowerCase();
|
|
66
|
-
}
|
|
67
|
-
function isLikelyText(path) {
|
|
68
|
-
return TEXT_EXTS.has(extOf(path));
|
|
69
|
-
}
|
|
70
30
|
function errMsg(err) {
|
|
71
31
|
return err instanceof Error ? err.message : String(err);
|
|
72
32
|
}
|
|
73
|
-
function
|
|
33
|
+
function trackerFor(trackers, ws, ctx, enabled) {
|
|
34
|
+
let sessions = trackers.get(ws);
|
|
35
|
+
if (sessions === void 0) {
|
|
36
|
+
sessions = /* @__PURE__ */ new Map();
|
|
37
|
+
trackers.set(ws, sessions);
|
|
38
|
+
}
|
|
39
|
+
let tracker = sessions.get(ctx.sessionID);
|
|
40
|
+
if (tracker === void 0) {
|
|
41
|
+
tracker = new FileVersionTracker(ws, enabled);
|
|
42
|
+
sessions.set(ctx.sessionID, tracker);
|
|
43
|
+
}
|
|
44
|
+
return tracker;
|
|
45
|
+
}
|
|
46
|
+
function mirageTools(ws, options = {}) {
|
|
47
|
+
const trackers = /* @__PURE__ */ new WeakMap();
|
|
48
|
+
const staleWriteProtection = options.staleWriteProtection ?? true;
|
|
74
49
|
const read = tool({
|
|
75
|
-
description: "Read a file. Returns UTF-8 text for source/data files
|
|
50
|
+
description: "Read a file. Returns UTF-8 text for source/data files, attaches PDFs and images for multimodal models, and returns metadata for other binary files.",
|
|
76
51
|
args: {
|
|
77
52
|
filePath: z.string().describe("Absolute path of the file to read.")
|
|
78
53
|
},
|
|
79
54
|
execute: async ({ filePath }, ctx) => {
|
|
80
55
|
const w = await resolveWs(ws, ctx);
|
|
81
|
-
|
|
56
|
+
const versions = trackerFor(trackers, w, ctx, staleWriteProtection);
|
|
82
57
|
try {
|
|
83
|
-
|
|
58
|
+
const result = await readWorkspaceFile(w, filePath, versions.read.bind(versions));
|
|
59
|
+
if (result.kind === "text") return result.content;
|
|
60
|
+
if (result.kind === "image" || result.kind === "file") {
|
|
61
|
+
const filename = result.path.split("/").pop() ?? result.path;
|
|
62
|
+
return {
|
|
63
|
+
output: `${result.path} (${result.mimeType}, ${String(result.bytes)} bytes)`,
|
|
64
|
+
attachments: [
|
|
65
|
+
{
|
|
66
|
+
type: "file",
|
|
67
|
+
mime: result.mimeType,
|
|
68
|
+
url: `data:${result.mimeType};base64,${encodeBase64(result.data)}`,
|
|
69
|
+
filename
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return result.note;
|
|
84
75
|
} catch (err) {
|
|
85
76
|
return `Error: ${errMsg(err)}`;
|
|
86
77
|
}
|
|
87
|
-
if (isLikelyText(filePath)) {
|
|
88
|
-
return new TextDecoder("utf-8", { fatal: false }).decode(bytes);
|
|
89
|
-
}
|
|
90
|
-
return `Binary file ${filePath} (${String(bytes.length)} bytes). Use the bash tool with head/file/wc/od to inspect.`;
|
|
91
78
|
}
|
|
92
79
|
});
|
|
93
80
|
const write = tool({
|
|
@@ -98,9 +85,14 @@ function mirageTools(ws) {
|
|
|
98
85
|
},
|
|
99
86
|
execute: async ({ filePath, content }, ctx) => {
|
|
100
87
|
const w = await resolveWs(ws, ctx);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
88
|
+
const versions = trackerFor(trackers, w, ctx, staleWriteProtection);
|
|
89
|
+
try {
|
|
90
|
+
await ensureParent(w, filePath);
|
|
91
|
+
await versions.write(filePath, content);
|
|
92
|
+
return `Wrote ${String(content.length)} bytes to ${filePath}`;
|
|
93
|
+
} catch (err) {
|
|
94
|
+
return `Error: ${errMsg(err)}`;
|
|
95
|
+
}
|
|
104
96
|
}
|
|
105
97
|
});
|
|
106
98
|
const edit = tool({
|
|
@@ -113,10 +105,12 @@ function mirageTools(ws) {
|
|
|
113
105
|
},
|
|
114
106
|
execute: async ({ filePath, oldString, newString, replaceAll }, ctx) => {
|
|
115
107
|
const w = await resolveWs(ws, ctx);
|
|
108
|
+
const versions = trackerFor(trackers, w, ctx, staleWriteProtection);
|
|
116
109
|
let current;
|
|
117
110
|
try {
|
|
118
|
-
current = await
|
|
119
|
-
} catch {
|
|
111
|
+
current = (await versions.readForEdit(filePath)).toString("utf8");
|
|
112
|
+
} catch (err) {
|
|
113
|
+
if (await w.fs.exists(filePath)) return `Error: ${errMsg(err)}`;
|
|
120
114
|
return `Error: file '${filePath}' not found`;
|
|
121
115
|
}
|
|
122
116
|
const count = current.split(oldString).length - 1;
|
|
@@ -127,7 +121,11 @@ function mirageTools(ws) {
|
|
|
127
121
|
return `Error: string '${oldString}' appears ${String(count)} times. Use replaceAll=true`;
|
|
128
122
|
}
|
|
129
123
|
const next = replaceAll === true ? current.split(oldString).join(newString) : current.replace(oldString, newString);
|
|
130
|
-
|
|
124
|
+
try {
|
|
125
|
+
await versions.writeEdit(filePath, next);
|
|
126
|
+
} catch (err) {
|
|
127
|
+
return `Error: ${errMsg(err)}`;
|
|
128
|
+
}
|
|
131
129
|
const occurrences = replaceAll === true ? count : 1;
|
|
132
130
|
return `Edited ${filePath} (${String(occurrences)} occurrence${occurrences === 1 ? "" : "s"})`;
|
|
133
131
|
}
|
|
@@ -196,10 +194,11 @@ function mirageTools(ws) {
|
|
|
196
194
|
});
|
|
197
195
|
return { read, write, edit, ls, bash, glob, grep };
|
|
198
196
|
}
|
|
199
|
-
function miragePlugin(ws) {
|
|
200
|
-
return () => Promise.resolve({ tool: mirageTools(ws) });
|
|
197
|
+
function miragePlugin(ws, options = {}) {
|
|
198
|
+
return () => Promise.resolve({ tool: mirageTools(ws, options) });
|
|
201
199
|
}
|
|
202
200
|
export {
|
|
201
|
+
StaleMirageFileError,
|
|
203
202
|
miragePlugin,
|
|
204
203
|
mirageTools
|
|
205
204
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/opencode/index.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Workspace } from '@struktoai/mirage-node'\nimport { z } from 'zod'\nimport { gnuDirname } from '@struktoai/mirage-core'\n\nexport interface ToolContext {\n sessionID: string\n messageID: string\n agent: string\n abort: AbortSignal\n}\n\nexport type WsResolver = (ctx: ToolContext) => Workspace | Promise<Workspace>\nexport type WsLike = Workspace | WsResolver\n\ninterface ToolDefinition<Args extends z.ZodRawShape = z.ZodRawShape> {\n description: string\n args: Args\n execute(args: z.infer<z.ZodObject<Args>>, context: ToolContext): Promise<string>\n}\n\nfunction tool<Args extends z.ZodRawShape>(input: ToolDefinition<Args>): ToolDefinition<Args> {\n return input\n}\n\nfunction isResolver(ws: WsLike): ws is WsResolver {\n return typeof ws === 'function'\n}\n\nasync function resolveWs(ws: WsLike, ctx: ToolContext): Promise<Workspace> {\n return isResolver(ws) ? ws(ctx) : ws\n}\n\nasync function ensureParent(ws: Workspace, path: string): Promise<void> {\n const parent = gnuDirname(path)\n if (parent === '/' || parent === '' || parent === '.') return\n if (await ws.fs.exists(parent)) return\n await ensureParent(ws, parent)\n try {\n await ws.fs.mkdir(parent)\n } catch (err) {\n if (!(await ws.fs.exists(parent))) throw err\n }\n}\n\nconst TEXT_EXTS = new Set([\n 'txt',\n 'md',\n 'json',\n 'jsonl',\n 'yaml',\n 'yml',\n 'csv',\n 'tsv',\n 'xml',\n 'html',\n 'htm',\n 'js',\n 'mjs',\n 'cjs',\n 'ts',\n 'tsx',\n 'jsx',\n 'py',\n 'rb',\n 'rs',\n 'go',\n 'java',\n 'c',\n 'cpp',\n 'h',\n 'hpp',\n 'sh',\n 'bash',\n 'zsh',\n 'sql',\n 'log',\n 'env',\n 'ini',\n 'toml',\n 'conf',\n 'cfg',\n])\n\nfunction extOf(path: string): string {\n const dot = path.lastIndexOf('.')\n if (dot < 0) return ''\n return path.slice(dot + 1).toLowerCase()\n}\n\nfunction isLikelyText(path: string): boolean {\n return TEXT_EXTS.has(extOf(path))\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nexport function mirageTools(ws: WsLike): Record<string, ToolDefinition> {\n const read = tool({\n description:\n 'Read a file. Returns UTF-8 text for source/data files; for binary files returns a metadata stub. Use the bash tool to inspect binaries.',\n args: {\n filePath: z.string().describe('Absolute path of the file to read.'),\n },\n execute: async ({ filePath }, ctx) => {\n const w = await resolveWs(ws, ctx)\n let bytes: Uint8Array\n try {\n bytes = await w.fs.readFile(filePath)\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n if (isLikelyText(filePath)) {\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes)\n }\n return `Binary file ${filePath} (${String(bytes.length)} bytes). Use the bash tool with head/file/wc/od to inspect.`\n },\n })\n\n const write = tool({\n description: 'Write content to a file. Creates missing parent directories.',\n args: {\n filePath: z.string().describe('Absolute path of the file to write.'),\n content: z.string().describe('UTF-8 text content to write.'),\n },\n execute: async ({ filePath, content }, ctx) => {\n const w = await resolveWs(ws, ctx)\n await ensureParent(w, filePath)\n await w.fs.writeFile(filePath, content)\n return `Wrote ${String(content.length)} bytes to ${filePath}`\n },\n })\n\n const edit = tool({\n description:\n 'Replace a string inside an existing file. Errors if the string appears more than once unless replaceAll is true.',\n args: {\n filePath: z.string().describe('Absolute path of the file to edit.'),\n oldString: z.string().describe('The exact string to replace.'),\n newString: z.string().describe('The replacement string.'),\n replaceAll: z\n .boolean()\n .optional()\n .describe('Replace every occurrence rather than requiring a unique match.'),\n },\n execute: async ({ filePath, oldString, newString, replaceAll }, ctx) => {\n const w = await resolveWs(ws, ctx)\n let current: string\n try {\n current = await w.fs.readFileText(filePath)\n } catch {\n return `Error: file '${filePath}' not found`\n }\n const count = current.split(oldString).length - 1\n if (count === 0) {\n return `Error: string not found in file: '${oldString}'`\n }\n if (count > 1 && replaceAll !== true) {\n return `Error: string '${oldString}' appears ${String(count)} times. Use replaceAll=true`\n }\n const next =\n replaceAll === true\n ? current.split(oldString).join(newString)\n : current.replace(oldString, newString)\n await w.fs.writeFile(filePath, next)\n const occurrences = replaceAll === true ? count : 1\n return `Edited ${filePath} (${String(occurrences)} occurrence${occurrences === 1 ? '' : 's'})`\n },\n })\n\n const ls = tool({\n description: 'List entries of a directory.',\n args: {\n path: z.string().describe('Absolute directory path.'),\n },\n execute: async ({ path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n let entries: string[]\n try {\n entries = await w.fs.readdir(path)\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n const lines: string[] = []\n for (const entry of entries) {\n const isDir = await w.fs.isDir(entry)\n lines.push(isDir ? `${entry}/` : entry)\n }\n return lines.join('\\n')\n },\n })\n\n const bash = tool({\n description: 'Execute a shell command and return stdout, stderr, and exit code.',\n args: {\n command: z.string().describe('The shell command to execute.'),\n },\n execute: async ({ command }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const io = await w.execute(command)\n const parts: string[] = []\n if (io.stdoutText.length > 0) parts.push(io.stdoutText)\n if (io.stderrText.length > 0) parts.push(io.stderrText)\n return parts.join('\\n').trim()\n },\n })\n\n const glob = tool({\n description: 'Find files matching a name pattern.',\n args: {\n pattern: z.string().describe('Filename pattern (e.g. \"*.ts\").'),\n path: z.string().optional().describe('Directory to search under. Defaults to /.'),\n },\n execute: async ({ pattern, path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const root = path ?? '/'\n const io = await w.execute(`find ${root} -name '${pattern.replace(/'/g, \"'\\\\''\")}'`)\n return io.stdoutText.trim()\n },\n })\n\n const grep = tool({\n description: 'Search for a regex pattern in files.',\n args: {\n pattern: z.string().describe('Pattern to search for.'),\n path: z.string().optional().describe('Directory or file to search under. Defaults to /.'),\n },\n execute: async ({ pattern, path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const root = path ?? '/'\n const escaped = pattern.replace(/'/g, \"'\\\\''\")\n const io = await w.execute(`grep -rn '${escaped}' ${root}`)\n return io.stdoutText.trim()\n },\n })\n\n return { read, write, edit, ls, bash, glob, grep }\n}\n\ninterface Hooks {\n tool?: Record<string, ToolDefinition>\n}\n\ntype PluginFn = (input: unknown) => Promise<Hooks>\n\nexport function miragePlugin(ws: WsLike): PluginFn {\n return () => Promise.resolve({ tool: mirageTools(ws) })\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/opencode/index.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { tool, type Plugin, type ToolContext, type ToolDefinition } from '@opencode-ai/plugin'\nimport type { Workspace } from '@struktoai/mirage-node'\nimport { encodeBase64, gnuDirname } from '@struktoai/mirage-core'\nimport { FileVersionTracker } from '../file-version.ts'\nimport { readWorkspaceFile } from '../read-file.ts'\n\nconst z = tool.schema\n\nexport type WsResolver = (ctx: ToolContext) => Workspace | Promise<Workspace>\nexport type WsLike = Workspace | WsResolver\n\nexport interface MirageOpenCodeOptions {\n staleWriteProtection?: boolean\n}\n\ntype SessionTrackers = Map<string, FileVersionTracker>\n\nfunction isResolver(ws: WsLike): ws is WsResolver {\n return typeof ws === 'function'\n}\n\nasync function resolveWs(ws: WsLike, ctx: ToolContext): Promise<Workspace> {\n return isResolver(ws) ? ws(ctx) : ws\n}\n\nasync function ensureParent(ws: Workspace, path: string): Promise<void> {\n const parent = gnuDirname(path)\n if (parent === '/' || parent === '' || parent === '.') return\n if (await ws.fs.exists(parent)) return\n await ensureParent(ws, parent)\n try {\n await ws.fs.mkdir(parent)\n } catch (err) {\n if (!(await ws.fs.exists(parent))) throw err\n }\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nfunction trackerFor(\n trackers: WeakMap<Workspace, SessionTrackers>,\n ws: Workspace,\n ctx: ToolContext,\n enabled: boolean,\n): FileVersionTracker {\n let sessions = trackers.get(ws)\n if (sessions === undefined) {\n sessions = new Map<string, FileVersionTracker>()\n trackers.set(ws, sessions)\n }\n let tracker = sessions.get(ctx.sessionID)\n if (tracker === undefined) {\n tracker = new FileVersionTracker(ws, enabled)\n sessions.set(ctx.sessionID, tracker)\n }\n return tracker\n}\n\nexport function mirageTools(\n ws: WsLike,\n options: MirageOpenCodeOptions = {},\n): Record<string, ToolDefinition> {\n const trackers = new WeakMap<Workspace, SessionTrackers>()\n const staleWriteProtection = options.staleWriteProtection ?? true\n const read = tool({\n description:\n 'Read a file. Returns UTF-8 text for source/data files, attaches PDFs and images for multimodal models, and returns metadata for other binary files.',\n args: {\n filePath: z.string().describe('Absolute path of the file to read.'),\n },\n execute: async ({ filePath }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const versions = trackerFor(trackers, w, ctx, staleWriteProtection)\n try {\n const result = await readWorkspaceFile(w, filePath, versions.read.bind(versions))\n if (result.kind === 'text') return result.content\n if (result.kind === 'image' || result.kind === 'file') {\n const filename = result.path.split('/').pop() ?? result.path\n return {\n output: `${result.path} (${result.mimeType}, ${String(result.bytes)} bytes)`,\n attachments: [\n {\n type: 'file' as const,\n mime: result.mimeType,\n url: `data:${result.mimeType};base64,${encodeBase64(result.data)}`,\n filename,\n },\n ],\n }\n }\n return result.note\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n },\n })\n\n const write = tool({\n description: 'Write content to a file. Creates missing parent directories.',\n args: {\n filePath: z.string().describe('Absolute path of the file to write.'),\n content: z.string().describe('UTF-8 text content to write.'),\n },\n execute: async ({ filePath, content }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const versions = trackerFor(trackers, w, ctx, staleWriteProtection)\n try {\n await ensureParent(w, filePath)\n await versions.write(filePath, content)\n return `Wrote ${String(content.length)} bytes to ${filePath}`\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n },\n })\n\n const edit = tool({\n description:\n 'Replace a string inside an existing file. Errors if the string appears more than once unless replaceAll is true.',\n args: {\n filePath: z.string().describe('Absolute path of the file to edit.'),\n oldString: z.string().describe('The exact string to replace.'),\n newString: z.string().describe('The replacement string.'),\n replaceAll: z\n .boolean()\n .optional()\n .describe('Replace every occurrence rather than requiring a unique match.'),\n },\n execute: async ({ filePath, oldString, newString, replaceAll }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const versions = trackerFor(trackers, w, ctx, staleWriteProtection)\n let current: string\n try {\n current = (await versions.readForEdit(filePath)).toString('utf8')\n } catch (err) {\n if (await w.fs.exists(filePath)) return `Error: ${errMsg(err)}`\n return `Error: file '${filePath}' not found`\n }\n const count = current.split(oldString).length - 1\n if (count === 0) {\n return `Error: string not found in file: '${oldString}'`\n }\n if (count > 1 && replaceAll !== true) {\n return `Error: string '${oldString}' appears ${String(count)} times. Use replaceAll=true`\n }\n const next =\n replaceAll === true\n ? current.split(oldString).join(newString)\n : current.replace(oldString, newString)\n try {\n await versions.writeEdit(filePath, next)\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n const occurrences = replaceAll === true ? count : 1\n return `Edited ${filePath} (${String(occurrences)} occurrence${occurrences === 1 ? '' : 's'})`\n },\n })\n\n const ls = tool({\n description: 'List entries of a directory.',\n args: {\n path: z.string().describe('Absolute directory path.'),\n },\n execute: async ({ path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n let entries: string[]\n try {\n entries = await w.fs.readdir(path)\n } catch (err) {\n return `Error: ${errMsg(err)}`\n }\n const lines: string[] = []\n for (const entry of entries) {\n const isDir = await w.fs.isDir(entry)\n lines.push(isDir ? `${entry}/` : entry)\n }\n return lines.join('\\n')\n },\n })\n\n const bash = tool({\n description: 'Execute a shell command and return stdout, stderr, and exit code.',\n args: {\n command: z.string().describe('The shell command to execute.'),\n },\n execute: async ({ command }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const io = await w.execute(command)\n const parts: string[] = []\n if (io.stdoutText.length > 0) parts.push(io.stdoutText)\n if (io.stderrText.length > 0) parts.push(io.stderrText)\n return parts.join('\\n').trim()\n },\n })\n\n const glob = tool({\n description: 'Find files matching a name pattern.',\n args: {\n pattern: z.string().describe('Filename pattern (e.g. \"*.ts\").'),\n path: z.string().optional().describe('Directory to search under. Defaults to /.'),\n },\n execute: async ({ pattern, path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const root = path ?? '/'\n const io = await w.execute(`find ${root} -name '${pattern.replace(/'/g, \"'\\\\''\")}'`)\n return io.stdoutText.trim()\n },\n })\n\n const grep = tool({\n description: 'Search for a regex pattern in files.',\n args: {\n pattern: z.string().describe('Pattern to search for.'),\n path: z.string().optional().describe('Directory or file to search under. Defaults to /.'),\n },\n execute: async ({ pattern, path }, ctx) => {\n const w = await resolveWs(ws, ctx)\n const root = path ?? '/'\n const escaped = pattern.replace(/'/g, \"'\\\\''\")\n const io = await w.execute(`grep -rn '${escaped}' ${root}`)\n return io.stdoutText.trim()\n },\n })\n\n return { read, write, edit, ls, bash, glob, grep }\n}\n\nexport function miragePlugin(ws: WsLike, options: MirageOpenCodeOptions = {}): Plugin {\n return () => Promise.resolve({ tool: mirageTools(ws, options) })\n}\n\nexport { StaleMirageFileError } from '../file-version.ts'\n"],"mappings":"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","names":[]}
|
package/dist/pi/index.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Workspace } from '@struktoai/mirage-core';
|
|
2
|
-
import {
|
|
3
|
-
export { B as BuildSystemPromptOptions, M as MIRAGE_SYSTEM_PROMPT, b as buildSystemPrompt } from '../prompt-
|
|
2
|
+
import { ReadOperations, WriteOperations, EditOperations, BashOperations, GrepOperations, FindOperations, LsOperations, InlineExtension } from '@earendil-works/pi-coding-agent';
|
|
3
|
+
export { B as BuildSystemPromptOptions, M as MIRAGE_SYSTEM_PROMPT, b as buildSystemPrompt } from '../prompt-Ca4hc1Ul.js';
|
|
4
|
+
export { S as StaleMirageFileError } from '../file-version-Clij-pms.js';
|
|
4
5
|
|
|
5
|
-
interface
|
|
6
|
-
|
|
6
|
+
interface MirageOperationsOptions {
|
|
7
|
+
staleWriteProtection?: boolean;
|
|
7
8
|
}
|
|
8
|
-
declare function mirageExtension(ws: Workspace, opts?: MirageExtensionOptions): ExtensionFactory;
|
|
9
|
-
|
|
10
9
|
interface MirageOperationsBundle {
|
|
11
10
|
read: ReadOperations;
|
|
12
11
|
write: WriteOperations;
|
|
@@ -16,6 +15,12 @@ interface MirageOperationsBundle {
|
|
|
16
15
|
find: FindOperations;
|
|
17
16
|
ls: LsOperations;
|
|
18
17
|
}
|
|
19
|
-
declare function mirageOperations(ws: Workspace): MirageOperationsBundle;
|
|
18
|
+
declare function mirageOperations(ws: Workspace, options?: MirageOperationsOptions): MirageOperationsBundle;
|
|
19
|
+
|
|
20
|
+
interface MirageExtensionOptions extends MirageOperationsOptions {
|
|
21
|
+
cwd?: string;
|
|
22
|
+
systemPrompt?: string | false;
|
|
23
|
+
}
|
|
24
|
+
declare function mirageExtension(ws: Workspace, opts?: MirageExtensionOptions): InlineExtension;
|
|
20
25
|
|
|
21
|
-
export { type MirageExtensionOptions, type MirageOperationsBundle, mirageExtension, mirageOperations };
|
|
26
|
+
export { type MirageExtensionOptions, type MirageOperationsBundle, type MirageOperationsOptions, mirageExtension, mirageOperations };
|