@zmzai/agent-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/fs-workspace.d.ts +7 -0
- package/dist/adapters/fs-workspace.d.ts.map +1 -0
- package/dist/adapters/fs-workspace.js +91 -0
- package/dist/adapters/fs-workspace.js.map +1 -0
- package/dist/adapters/index.d.ts +46 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +14 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openai-provider.d.ts +17 -0
- package/dist/adapters/openai-provider.d.ts.map +1 -0
- package/dist/adapters/openai-provider.js +116 -0
- package/dist/adapters/openai-provider.js.map +1 -0
- package/dist/adapters/subprocess-sandbox.d.ts +7 -0
- package/dist/adapters/subprocess-sandbox.d.ts.map +1 -0
- package/dist/adapters/subprocess-sandbox.js +91 -0
- package/dist/adapters/subprocess-sandbox.js.map +1 -0
- package/dist/adapters/workspace-edit.d.ts +19 -0
- package/dist/adapters/workspace-edit.d.ts.map +1 -0
- package/dist/adapters/workspace-edit.js +36 -0
- package/dist/adapters/workspace-edit.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +191 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent/loader.d.ts +17 -0
- package/dist/core/agent/loader.d.ts.map +1 -0
- package/dist/core/agent/loader.js +148 -0
- package/dist/core/agent/loader.js.map +1 -0
- package/dist/core/agent/plugin.d.ts +59 -0
- package/dist/core/agent/plugin.d.ts.map +1 -0
- package/dist/core/agent/plugin.js +125 -0
- package/dist/core/agent/plugin.js.map +1 -0
- package/dist/core/agent/registry.d.ts +45 -0
- package/dist/core/agent/registry.d.ts.map +1 -0
- package/dist/core/agent/registry.js +98 -0
- package/dist/core/agent/registry.js.map +1 -0
- package/dist/core/agent/resolver.d.ts +16 -0
- package/dist/core/agent/resolver.d.ts.map +1 -0
- package/dist/core/agent/resolver.js +2 -0
- package/dist/core/agent/resolver.js.map +1 -0
- package/dist/core/events/bus.d.ts +30 -0
- package/dist/core/events/bus.d.ts.map +1 -0
- package/dist/core/events/bus.js +112 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/manifest.d.ts +117 -0
- package/dist/core/events/manifest.d.ts.map +1 -0
- package/dist/core/events/manifest.js +69 -0
- package/dist/core/events/manifest.js.map +1 -0
- package/dist/core/permission/engine.d.ts +84 -0
- package/dist/core/permission/engine.d.ts.map +1 -0
- package/dist/core/permission/engine.js +131 -0
- package/dist/core/permission/engine.js.map +1 -0
- package/dist/core/permission/ruleset.d.ts +30 -0
- package/dist/core/permission/ruleset.d.ts.map +1 -0
- package/dist/core/permission/ruleset.js +85 -0
- package/dist/core/permission/ruleset.js.map +1 -0
- package/dist/core/runtime/compaction.d.ts +59 -0
- package/dist/core/runtime/compaction.d.ts.map +1 -0
- package/dist/core/runtime/compaction.js +108 -0
- package/dist/core/runtime/compaction.js.map +1 -0
- package/dist/core/runtime/lease-recovery.d.ts +45 -0
- package/dist/core/runtime/lease-recovery.d.ts.map +1 -0
- package/dist/core/runtime/lease-recovery.js +112 -0
- package/dist/core/runtime/lease-recovery.js.map +1 -0
- package/dist/core/runtime/loop-guard.d.ts +51 -0
- package/dist/core/runtime/loop-guard.d.ts.map +1 -0
- package/dist/core/runtime/loop-guard.js +90 -0
- package/dist/core/runtime/loop-guard.js.map +1 -0
- package/dist/core/runtime/pi-bridge.d.ts +53 -0
- package/dist/core/runtime/pi-bridge.d.ts.map +1 -0
- package/dist/core/runtime/pi-bridge.js +259 -0
- package/dist/core/runtime/pi-bridge.js.map +1 -0
- package/dist/core/runtime/runner.d.ts +127 -0
- package/dist/core/runtime/runner.d.ts.map +1 -0
- package/dist/core/runtime/runner.js +614 -0
- package/dist/core/runtime/runner.js.map +1 -0
- package/dist/core/session/ids.d.ts +7 -0
- package/dist/core/session/ids.d.ts.map +1 -0
- package/dist/core/session/ids.js +18 -0
- package/dist/core/session/ids.js.map +1 -0
- package/dist/core/session/jsonl-store.d.ts +14 -0
- package/dist/core/session/jsonl-store.d.ts.map +1 -0
- package/dist/core/session/jsonl-store.js +142 -0
- package/dist/core/session/jsonl-store.js.map +1 -0
- package/dist/core/session/store.d.ts +25 -0
- package/dist/core/session/store.d.ts.map +1 -0
- package/dist/core/session/store.js +2 -0
- package/dist/core/session/store.js.map +1 -0
- package/dist/core/session/types.d.ts +142 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/tools/adapter.d.ts +33 -0
- package/dist/core/tools/adapter.d.ts.map +1 -0
- package/dist/core/tools/adapter.js +87 -0
- package/dist/core/tools/adapter.js.map +1 -0
- package/dist/core/tools/builtins.d.ts +13 -0
- package/dist/core/tools/builtins.d.ts.map +1 -0
- package/dist/core/tools/builtins.js +219 -0
- package/dist/core/tools/builtins.js.map +1 -0
- package/dist/core/tools/context.d.ts +136 -0
- package/dist/core/tools/context.d.ts.map +1 -0
- package/dist/core/tools/context.js +2 -0
- package/dist/core/tools/context.js.map +1 -0
- package/dist/core/tools/def.d.ts +27 -0
- package/dist/core/tools/def.d.ts.map +1 -0
- package/dist/core/tools/def.js +2 -0
- package/dist/core/tools/def.js.map +1 -0
- package/dist/core/tools/qa-check.d.ts +30 -0
- package/dist/core/tools/qa-check.d.ts.map +1 -0
- package/dist/core/tools/qa-check.js +50 -0
- package/dist/core/tools/qa-check.js.map +1 -0
- package/dist/core/tools/task.d.ts +8 -0
- package/dist/core/tools/task.d.ts.map +1 -0
- package/dist/core/tools/task.js +33 -0
- package/dist/core/tools/task.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/server/create-server.d.ts +51 -0
- package/dist/server/create-server.d.ts.map +1 -0
- package/dist/server/create-server.js +29 -0
- package/dist/server/create-server.js.map +1 -0
- package/openapi.yaml +239 -0
- package/package.json +32 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { unlink } from "node:fs/promises";
|
|
2
|
+
import type { WorkspaceFiles } from "../core/tools/context.js";
|
|
3
|
+
export declare function createFsWorkspaceFiles(input: {
|
|
4
|
+
root: string;
|
|
5
|
+
}): WorkspaceFiles;
|
|
6
|
+
export { unlink as deleteFsFile };
|
|
7
|
+
//# sourceMappingURL=fs-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-workspace.d.ts","sourceRoot":"","sources":["../../src/adapters/fs-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAiC/D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAmD9E;AAED,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, readdir, unlink } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createUnifiedDiff } from "./workspace-edit.js";
|
|
5
|
+
const MAX_FILE_BYTES = 512 * 1024;
|
|
6
|
+
function revFile(root) {
|
|
7
|
+
return path.join(root, ".fw-revisions.json");
|
|
8
|
+
}
|
|
9
|
+
async function loadRevisions(root) {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(await readFile(revFile(root), "utf8"));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function saveRevisions(root, revisions) {
|
|
18
|
+
await writeFile(revFile(root), JSON.stringify(revisions.slice(-200), null, 2), "utf8");
|
|
19
|
+
}
|
|
20
|
+
function safeJoin(root, rel) {
|
|
21
|
+
const candidate = path.resolve(root, rel);
|
|
22
|
+
if (candidate !== root && !candidate.startsWith(root + path.sep))
|
|
23
|
+
return null;
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
export function createFsWorkspaceFiles(input) {
|
|
27
|
+
const root = path.resolve(input.root);
|
|
28
|
+
return {
|
|
29
|
+
async list() {
|
|
30
|
+
if (!existsSync(root))
|
|
31
|
+
return [];
|
|
32
|
+
const walk = async (dir) => {
|
|
33
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
if (entry.name === ".fw-revisions.json" || entry.name.startsWith(".git"))
|
|
37
|
+
continue;
|
|
38
|
+
const full = path.join(dir, entry.name);
|
|
39
|
+
if (entry.isDirectory())
|
|
40
|
+
out.push(...(await walk(full)));
|
|
41
|
+
else
|
|
42
|
+
out.push({ path: path.relative(root, full), bytes: (await readFile(full)).length });
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
return walk(root);
|
|
47
|
+
},
|
|
48
|
+
async read(rel) {
|
|
49
|
+
const full = safeJoin(root, rel);
|
|
50
|
+
if (!full || !existsSync(full))
|
|
51
|
+
return null;
|
|
52
|
+
const stat = await import("node:fs/promises").then((m) => m.stat(full));
|
|
53
|
+
if (!stat.isFile())
|
|
54
|
+
return null;
|
|
55
|
+
if (stat.size > MAX_FILE_BYTES)
|
|
56
|
+
return null;
|
|
57
|
+
return { path: rel, content: await readFile(full, "utf8") };
|
|
58
|
+
},
|
|
59
|
+
async write({ path: rel, content, summary }) {
|
|
60
|
+
const full = safeJoin(root, rel);
|
|
61
|
+
if (!full)
|
|
62
|
+
return null;
|
|
63
|
+
await mkdir(path.dirname(full), { recursive: true });
|
|
64
|
+
const before = existsSync(full) ? await readFile(full, "utf8") : null;
|
|
65
|
+
if (Buffer.byteLength(content, "utf8") > MAX_FILE_BYTES)
|
|
66
|
+
return null;
|
|
67
|
+
await writeFile(full, content, "utf8");
|
|
68
|
+
const id = `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
69
|
+
await saveRevisions(root, [...(await loadRevisions(root)), { id, path: rel, before, after: content, summary, at: new Date().toISOString() }]);
|
|
70
|
+
return { revisionId: id, diff: createUnifiedDiff({ path: rel, operation: before === null ? "create" : "update", before, after: content }) };
|
|
71
|
+
},
|
|
72
|
+
async edit({ path: rel, oldText, newText, summary }) {
|
|
73
|
+
const full = safeJoin(root, rel);
|
|
74
|
+
if (!full || !existsSync(full))
|
|
75
|
+
return { error: `文件不存在:${rel}` };
|
|
76
|
+
const content = await readFile(full, "utf8");
|
|
77
|
+
const first = content.indexOf(oldText);
|
|
78
|
+
if (first === -1)
|
|
79
|
+
return { error: "EDIT_TARGET_NOT_FOUND" };
|
|
80
|
+
if (content.indexOf(oldText, first + oldText.length) !== -1)
|
|
81
|
+
return { error: "EDIT_TARGET_AMBIGUOUS" };
|
|
82
|
+
const after = `${content.slice(0, first)}${newText}${content.slice(first + oldText.length)}`;
|
|
83
|
+
await writeFile(full, after, "utf8");
|
|
84
|
+
const id = `rev_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
85
|
+
await saveRevisions(root, [...(await loadRevisions(root)), { id, path: rel, before: content, after, summary, at: new Date().toISOString() }]);
|
|
86
|
+
return { revisionId: id, diff: createUnifiedDiff({ path: rel, operation: "update", before: content, after }) };
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export { unlink as deleteFsFile };
|
|
91
|
+
//# sourceMappingURL=fs-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-workspace.js","sourceRoot":"","sources":["../../src/adapters/fs-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { StreamFn } from "@earendil-works/pi-agent-core";
|
|
3
|
+
import type { ModelRef, SessionInfo } from "../core/session/types.js";
|
|
4
|
+
import type { SandboxSnapshot, SandboxExecResult, SandboxExecInput } from "../core/tools/context.js";
|
|
5
|
+
/** ModelProvider (M5 spec §5): the package's seam to the outside model
|
|
6
|
+
* runtime. Products bind relay/OpenAI/etc.; the CLI binds an OpenAI-compatible
|
|
7
|
+
* provider. The framework only ever talks to PI through these two methods. */
|
|
8
|
+
export interface ModelProvider {
|
|
9
|
+
/** Resolves a model reference to a PI Model (used for the main loop). */
|
|
10
|
+
getModel(ref: ModelRef): Model<Api>;
|
|
11
|
+
/** Builds the PI streamFn for a run (per-session billing identity). */
|
|
12
|
+
streamFor(session: SessionInfo): StreamFn;
|
|
13
|
+
}
|
|
14
|
+
/** SandboxExecutor (M5 spec §5): isolated command execution + snapshot
|
|
15
|
+
* building. The package ships a subprocess reference implementation (no
|
|
16
|
+
* isolation, demo-only); products provide the OpenSandbox-backed one. */
|
|
17
|
+
export interface SandboxExecutor {
|
|
18
|
+
/** Builds the workspace snapshot handed to the sandbox. */
|
|
19
|
+
buildSnapshot(input: {
|
|
20
|
+
userId: string;
|
|
21
|
+
workspaceId: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
}): Promise<SandboxSnapshot>;
|
|
24
|
+
/** Runs one command in the sandbox and returns the result. */
|
|
25
|
+
run(input: SandboxExecInput & {
|
|
26
|
+
userId: string;
|
|
27
|
+
workspaceId: string;
|
|
28
|
+
runId: string;
|
|
29
|
+
}): Promise<SandboxExecResult>;
|
|
30
|
+
}
|
|
31
|
+
/** No-op sandbox: the framework still works for read/write/todo/subagent
|
|
32
|
+
* flows without any execution backend; bash tool errors out clearly. */
|
|
33
|
+
export declare function noopSandboxExecutor(reason?: string): SandboxExecutor;
|
|
34
|
+
/** LeaseStore (M5): the runner stamps a lease on the session doc while it owns
|
|
35
|
+
* a run. Products implement over Mongo; the package's JSONL store implements
|
|
36
|
+
* over files. Recovery scans expired leases via the same interface. */
|
|
37
|
+
export interface LeaseStore {
|
|
38
|
+
stampLease(sessionId: string, owner: string, expiresAt: Date): Promise<void>;
|
|
39
|
+
clearLease(sessionId: string): Promise<void>;
|
|
40
|
+
listExpiredLeases(): Promise<{
|
|
41
|
+
sessionId: string;
|
|
42
|
+
}[]>;
|
|
43
|
+
clearLeaseIfExpired(sessionId: string): Promise<boolean>;
|
|
44
|
+
}
|
|
45
|
+
export declare const leaseDurationMs: number;
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAErG;;+EAE+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,uEAAuE;IACvE,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAC;CAC3C;AAED;;0EAE0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,aAAa,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvG,8DAA8D;IAC9D,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnH;AAED;yEACyE;AACzE,wBAAgB,mBAAmB,CAAC,MAAM,SAAa,GAAG,eAAe,CASxE;AAED;;wEAEwE;AACxE,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACtD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,eAAe,QAAiB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** No-op sandbox: the framework still works for read/write/todo/subagent
|
|
2
|
+
* flows without any execution backend; bash tool errors out clearly. */
|
|
3
|
+
export function noopSandboxExecutor(reason = "未配置沙箱执行器") {
|
|
4
|
+
return {
|
|
5
|
+
async buildSnapshot() {
|
|
6
|
+
return { revisionId: null, files: [] };
|
|
7
|
+
},
|
|
8
|
+
async run() {
|
|
9
|
+
return { ok: false, outcome: "failed", exitCode: 1, outputText: "", durationMs: 0, artifacts: [], errorMessage: reason };
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export const leaseDurationMs = 10 * 60 * 1000;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAyBA;yEACyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,MAAM,GAAG,UAAU;IACrD,OAAO;QACL,KAAK,CAAC,aAAa;YACjB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,GAAG;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3H,CAAC;KACF,CAAC;AACJ,CAAC;AAYD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ModelProvider } from "./index.js";
|
|
2
|
+
/** OpenAI-compatible ModelProvider (M5 CLI reference): drives the framework
|
|
3
|
+
* against any OpenAI-compatible chat-completions endpoint via env vars:
|
|
4
|
+
*
|
|
5
|
+
* OPENAI_BASE_URL=https://api.openai.com/v1
|
|
6
|
+
* OPENAI_API_KEY=sk-...
|
|
7
|
+
* OPENAI_MODEL=gpt-4o (default model)
|
|
8
|
+
*
|
|
9
|
+
* The same provider serves relay-compatible backends (m.zmzai.cloud uses the
|
|
10
|
+
* OpenAI wire format), so the framework runs standalone with zero product
|
|
11
|
+
* coupling. */
|
|
12
|
+
export declare function createOpenAiModelProvider(input?: {
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
defaultModel?: string;
|
|
16
|
+
}): ModelProvider;
|
|
17
|
+
//# sourceMappingURL=openai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../src/adapters/openai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;;;;;gBASgB;AAChB,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAoG7H"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** OpenAI-compatible ModelProvider (M5 CLI reference): drives the framework
|
|
2
|
+
* against any OpenAI-compatible chat-completions endpoint via env vars:
|
|
3
|
+
*
|
|
4
|
+
* OPENAI_BASE_URL=https://api.openai.com/v1
|
|
5
|
+
* OPENAI_API_KEY=sk-...
|
|
6
|
+
* OPENAI_MODEL=gpt-4o (default model)
|
|
7
|
+
*
|
|
8
|
+
* The same provider serves relay-compatible backends (m.zmzai.cloud uses the
|
|
9
|
+
* OpenAI wire format), so the framework runs standalone with zero product
|
|
10
|
+
* coupling. */
|
|
11
|
+
export function createOpenAiModelProvider(input) {
|
|
12
|
+
const baseUrl = (input?.baseUrl ?? process.env.OPENAI_BASE_URL ?? "https://api.openai.com/v1").replace(/\/$/, "");
|
|
13
|
+
const apiKey = input?.apiKey ?? process.env.OPENAI_API_KEY ?? "";
|
|
14
|
+
const defaultModel = input?.defaultModel ?? process.env.OPENAI_MODEL ?? "gpt-4o";
|
|
15
|
+
return {
|
|
16
|
+
getModel(ref) {
|
|
17
|
+
return {
|
|
18
|
+
id: ref.modelId || defaultModel,
|
|
19
|
+
name: ref.modelId || defaultModel,
|
|
20
|
+
api: "openai-completions",
|
|
21
|
+
provider: "zmzai-openai",
|
|
22
|
+
baseUrl,
|
|
23
|
+
reasoning: false,
|
|
24
|
+
input: ["text"],
|
|
25
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
26
|
+
contextWindow: 128_000,
|
|
27
|
+
maxTokens: 16_384,
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
streamFor(session) {
|
|
31
|
+
void session;
|
|
32
|
+
// streamFn built per call; auth header injected by the provider wrapper.
|
|
33
|
+
return (async (model, context, options) => {
|
|
34
|
+
const { createAssistantMessageEventStream } = await import("@earendil-works/pi-ai");
|
|
35
|
+
const stream = createAssistantMessageEventStream();
|
|
36
|
+
void (async () => {
|
|
37
|
+
try {
|
|
38
|
+
const messages = (context.messages ?? []).map((message) => {
|
|
39
|
+
if (message.role === "user" || message.role === "assistant") {
|
|
40
|
+
const content = message.content;
|
|
41
|
+
if (typeof content === "string")
|
|
42
|
+
return { role: message.role, content };
|
|
43
|
+
if (Array.isArray(content)) {
|
|
44
|
+
return { role: message.role, content: content.filter((b) => b.type === "text").map((b) => ({ type: "text", text: b.text ?? "" })) };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (message.role === "toolResult") {
|
|
48
|
+
const text = Array.isArray(message.content)
|
|
49
|
+
? message.content.filter((b) => b.type === "text").map((b) => b.text ?? "").join("\n")
|
|
50
|
+
: String(message.content ?? "");
|
|
51
|
+
return { role: "tool", content: text, tool_call_id: message.toolCallId ?? "" };
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}).filter(Boolean);
|
|
55
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: { "content-type": "application/json", ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}) },
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
model: model.id,
|
|
60
|
+
messages,
|
|
61
|
+
stream: true,
|
|
62
|
+
...(options?.maxTokens ? { max_tokens: options.maxTokens } : {}),
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok || !response.body) {
|
|
66
|
+
const error = { type: "error", reason: "error", error: await response.text().catch(() => "HTTP error") };
|
|
67
|
+
stream.push(error);
|
|
68
|
+
stream.end(error);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const reader = response.body.getReader();
|
|
72
|
+
const decoder = new TextDecoder();
|
|
73
|
+
let buffer = "";
|
|
74
|
+
const partial = { role: "assistant", content: [{ type: "text", text: "" }] };
|
|
75
|
+
while (true) {
|
|
76
|
+
const { done, value } = await reader.read();
|
|
77
|
+
if (done)
|
|
78
|
+
break;
|
|
79
|
+
buffer += decoder.decode(value, { stream: true });
|
|
80
|
+
const lines = buffer.split("\n");
|
|
81
|
+
buffer = lines.pop() ?? "";
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (!trimmed.startsWith("data:"))
|
|
85
|
+
continue;
|
|
86
|
+
const data = trimmed.slice(5).trim();
|
|
87
|
+
if (data === "[DONE]")
|
|
88
|
+
continue;
|
|
89
|
+
try {
|
|
90
|
+
const chunk = JSON.parse(data);
|
|
91
|
+
const delta = chunk.choices?.[0]?.delta?.content;
|
|
92
|
+
if (delta) {
|
|
93
|
+
partial.content[0].text += delta;
|
|
94
|
+
stream.push({ type: "text_delta", contentIndex: 0, delta, partial });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// partial JSON — ignore
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
stream.push({ type: "done", reason: "stop", message: partial });
|
|
103
|
+
stream.end(partial);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const err = error instanceof Error ? error.message : String(error);
|
|
107
|
+
stream.push({ type: "error", reason: "error", error: err });
|
|
108
|
+
stream.end({ role: "assistant", content: [{ type: "text", text: "" }], stopReason: "error", errorMessage: err });
|
|
109
|
+
}
|
|
110
|
+
})();
|
|
111
|
+
return stream;
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=openai-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/adapters/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SandboxExecutor } from "../adapters/index.js";
|
|
2
|
+
/** Subprocess SandboxExecutor (M5 §5 CLI reference implementation): writes the
|
|
3
|
+
* snapshot to a temp dir and runs the command as a plain child process — NO
|
|
4
|
+
* isolation. Good enough to demo the framework standalone; production uses
|
|
5
|
+
* OpenSandbox. */
|
|
6
|
+
export declare function createSubprocessSandbox(): SandboxExecutor;
|
|
7
|
+
//# sourceMappingURL=subprocess-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess-sandbox.d.ts","sourceRoot":"","sources":["../../src/adapters/subprocess-sandbox.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D;;;mBAGmB;AACnB,wBAAgB,uBAAuB,IAAI,eAAe,CAoEzD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtemp, writeFile, rm, readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
/** Subprocess SandboxExecutor (M5 §5 CLI reference implementation): writes the
|
|
6
|
+
* snapshot to a temp dir and runs the command as a plain child process — NO
|
|
7
|
+
* isolation. Good enough to demo the framework standalone; production uses
|
|
8
|
+
* OpenSandbox. */
|
|
9
|
+
export function createSubprocessSandbox() {
|
|
10
|
+
return {
|
|
11
|
+
async buildSnapshot(input) {
|
|
12
|
+
void input;
|
|
13
|
+
return { revisionId: null, files: [] };
|
|
14
|
+
},
|
|
15
|
+
async run(input) {
|
|
16
|
+
const dir = await mkdtemp(path.join(tmpdir(), "fw-sandbox-"));
|
|
17
|
+
try {
|
|
18
|
+
for (const file of input.snapshot.files) {
|
|
19
|
+
const full = path.join(dir, file.path);
|
|
20
|
+
await writeFile(full, file.content, "utf8");
|
|
21
|
+
}
|
|
22
|
+
const cwd = input.command.cwd ? path.join(dir, input.command.cwd) : dir;
|
|
23
|
+
const result = await new Promise((resolve, reject) => {
|
|
24
|
+
const child = spawn(input.command.program, input.command.args ?? [], {
|
|
25
|
+
cwd,
|
|
26
|
+
env: { ...process.env, ...(input.command.env ?? {}) },
|
|
27
|
+
shell: false,
|
|
28
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
29
|
+
});
|
|
30
|
+
let output = "";
|
|
31
|
+
child.stdout.on("data", (chunk) => {
|
|
32
|
+
output += String(chunk);
|
|
33
|
+
});
|
|
34
|
+
child.stderr.on("data", (chunk) => {
|
|
35
|
+
output += String(chunk);
|
|
36
|
+
});
|
|
37
|
+
child.on("error", reject);
|
|
38
|
+
child.on("close", (code) => resolve({ code, output }));
|
|
39
|
+
});
|
|
40
|
+
// Collect files written during the run as deliverables.
|
|
41
|
+
const artifacts = [];
|
|
42
|
+
const walk = async (dirPath) => {
|
|
43
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
const full = path.join(dirPath, entry.name);
|
|
46
|
+
if (entry.isDirectory()) {
|
|
47
|
+
await walk(full);
|
|
48
|
+
}
|
|
49
|
+
else if (entry.name !== ".fw-sandbox") {
|
|
50
|
+
const rel = path.relative(dir, full);
|
|
51
|
+
const content = await readFile(full);
|
|
52
|
+
artifacts.push({
|
|
53
|
+
path: rel,
|
|
54
|
+
bytes: content.length,
|
|
55
|
+
contentType: guessContentType(rel),
|
|
56
|
+
downloadUrl: `file://${full}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
await walk(dir);
|
|
62
|
+
// Only files NOT in the original snapshot count as deliverables.
|
|
63
|
+
const snapshotPaths = new Set(input.snapshot.files.map((f) => f.path));
|
|
64
|
+
const deliverables = artifacts.filter((a) => !snapshotPaths.has(a.path));
|
|
65
|
+
return {
|
|
66
|
+
ok: result.code === 0,
|
|
67
|
+
outcome: result.code === 0 ? "succeeded" : "failed",
|
|
68
|
+
exitCode: result.code,
|
|
69
|
+
outputText: result.output,
|
|
70
|
+
durationMs: 0,
|
|
71
|
+
artifacts: deliverables,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await rm(dir, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function guessContentType(filename) {
|
|
81
|
+
const ext = path.extname(filename).toLowerCase();
|
|
82
|
+
const map = {
|
|
83
|
+
".html": "text/html", ".htm": "text/html", ".png": "image/png", ".jpg": "image/jpeg",
|
|
84
|
+
".jpeg": "image/jpeg", ".gif": "image/gif", ".svg": "image/svg+xml", ".webp": "image/webp",
|
|
85
|
+
".pdf": "application/pdf", ".md": "text/markdown", ".txt": "text/plain", ".css": "text/css",
|
|
86
|
+
".js": "text/javascript", ".json": "application/json", ".py": "text/x-python",
|
|
87
|
+
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
88
|
+
};
|
|
89
|
+
return map[ext] ?? "application/octet-stream";
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=subprocess-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess-sandbox.js","sourceRoot":"","sources":["../../src/adapters/subprocess-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Pure workspace text-edit + diff helpers, shared by the framework's
|
|
2
|
+
* mongo-workspace (direct write/edit) and any code that renders a unified
|
|
3
|
+
* diff. Extracted from the legacy proposals module so the proposal-staging
|
|
4
|
+
* machinery could be retired without losing these. */
|
|
5
|
+
export type FileChange = {
|
|
6
|
+
path: string;
|
|
7
|
+
operation: "create" | "update" | "delete";
|
|
8
|
+
before: string | null;
|
|
9
|
+
after: string | null;
|
|
10
|
+
};
|
|
11
|
+
export declare function createUnifiedDiff(change: FileChange): string;
|
|
12
|
+
/** Applies an exact oldText → newText replacement. Returns an error when the
|
|
13
|
+
* target is missing or occurs more than once (ambiguous edit). */
|
|
14
|
+
export declare function applySingleEdit(content: string, oldText: string, newText: string): {
|
|
15
|
+
content: string;
|
|
16
|
+
} | {
|
|
17
|
+
error: string;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=workspace-edit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-edit.d.ts","sourceRoot":"","sources":["../../src/adapters/workspace-edit.ts"],"names":[],"mappings":"AAAA;;;uDAGuD;AAEvD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAWF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAU5D;AAED;mEACmE;AACnE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAM1H"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Pure workspace text-edit + diff helpers, shared by the framework's
|
|
2
|
+
* mongo-workspace (direct write/edit) and any code that renders a unified
|
|
3
|
+
* diff. Extracted from the legacy proposals module so the proposal-staging
|
|
4
|
+
* machinery could be retired without losing these. */
|
|
5
|
+
function lineCount(value) {
|
|
6
|
+
return value ? value.split("\n").length : 0;
|
|
7
|
+
}
|
|
8
|
+
function diffLines(prefix, value) {
|
|
9
|
+
if (value === null || value === "")
|
|
10
|
+
return [];
|
|
11
|
+
return value.split("\n").map((line) => `${prefix}${line}`);
|
|
12
|
+
}
|
|
13
|
+
export function createUnifiedDiff(change) {
|
|
14
|
+
const beforeLabel = change.before === null ? "/dev/null" : `a/${change.path}`;
|
|
15
|
+
const afterLabel = change.after === null ? "/dev/null" : `b/${change.path}`;
|
|
16
|
+
return [
|
|
17
|
+
`--- ${beforeLabel}`,
|
|
18
|
+
`+++ ${afterLabel}`,
|
|
19
|
+
`@@ -1,${lineCount(change.before ?? "")} +1,${lineCount(change.after ?? "")} @@`,
|
|
20
|
+
...diffLines("-", change.before),
|
|
21
|
+
...diffLines("+", change.after),
|
|
22
|
+
].join("\n");
|
|
23
|
+
}
|
|
24
|
+
/** Applies an exact oldText → newText replacement. Returns an error when the
|
|
25
|
+
* target is missing or occurs more than once (ambiguous edit). */
|
|
26
|
+
export function applySingleEdit(content, oldText, newText) {
|
|
27
|
+
if (!oldText)
|
|
28
|
+
return { error: "EDIT_TARGET_REQUIRED" };
|
|
29
|
+
const first = content.indexOf(oldText);
|
|
30
|
+
if (first === -1)
|
|
31
|
+
return { error: "EDIT_TARGET_NOT_FOUND" };
|
|
32
|
+
if (content.indexOf(oldText, first + oldText.length) !== -1)
|
|
33
|
+
return { error: "EDIT_TARGET_AMBIGUOUS" };
|
|
34
|
+
return { content: `${content.slice(0, first)}${newText}${content.slice(first + oldText.length)}` };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=workspace-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-edit.js","sourceRoot":"","sources":["../../src/adapters/workspace-edit.ts"],"names":[],"mappings":"AAAA;;;uDAGuD;AASvD,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,KAAoB;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5E,OAAO;QACL,OAAO,WAAW,EAAE;QACpB,OAAO,UAAU,EAAE;QACnB,SAAS,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK;QAChF,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;QAChC,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAe,EAAE,OAAe;IAC/E,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC5D,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACvG,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACrG,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|