@polpo-ai/node 0.13.1 → 0.14.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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/sandbox/lease.d.ts +72 -0
- package/dist/sandbox/lease.d.ts.map +1 -0
- package/dist/sandbox/lease.js +177 -0
- package/dist/sandbox/lease.js.map +1 -0
- package/dist/sandbox/local-provider.d.ts +14 -0
- package/dist/sandbox/local-provider.d.ts.map +1 -0
- package/dist/sandbox/local-provider.js +16 -0
- package/dist/sandbox/local-provider.js.map +1 -0
- package/dist/sandbox/shell-backed-fs.d.ts +34 -0
- package/dist/sandbox/shell-backed-fs.d.ts.map +1 -0
- package/dist/sandbox/shell-backed-fs.js +79 -0
- package/dist/sandbox/shell-backed-fs.js.map +1 -0
- package/package.json +8 -8
package/dist/index.d.ts
CHANGED
|
@@ -27,4 +27,8 @@ export { createEmailTools, ALL_EMAIL_TOOL_NAMES } from "@polpo-ai/tools";
|
|
|
27
27
|
export { createVaultTools, ALL_VAULT_TOOL_NAMES } from "@polpo-ai/tools";
|
|
28
28
|
export { createAudioTools, ALL_AUDIO_TOOL_NAMES } from "@polpo-ai/tools";
|
|
29
29
|
export { createImageTools, ALL_IMAGE_TOOL_NAMES } from "@polpo-ai/tools";
|
|
30
|
+
export { SandboxLease, DEFAULT_IDLE_SUSPEND_MS } from "./sandbox/lease.js";
|
|
31
|
+
export type { SandboxLeaseOptions } from "./sandbox/lease.js";
|
|
32
|
+
export { LocalSandboxProvider } from "./sandbox/local-provider.js";
|
|
33
|
+
export { ShellBackedFileSystem } from "./sandbox/shell-backed-fs.js";
|
|
30
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC;AAGhC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGnF,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGpG,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtM,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,YAAY,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1H,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -30,4 +30,8 @@ export { createEmailTools, ALL_EMAIL_TOOL_NAMES } from "@polpo-ai/tools";
|
|
|
30
30
|
export { createVaultTools, ALL_VAULT_TOOL_NAMES } from "@polpo-ai/tools";
|
|
31
31
|
export { createAudioTools, ALL_AUDIO_TOOL_NAMES } from "@polpo-ai/tools";
|
|
32
32
|
export { createImageTools, ALL_IMAGE_TOOL_NAMES } from "@polpo-ai/tools";
|
|
33
|
+
// ── SandboxProvider (F1: lease + local provider) ─────────────────────────
|
|
34
|
+
export { SandboxLease, DEFAULT_IDLE_SUSPEND_MS } from "./sandbox/lease.js";
|
|
35
|
+
export { LocalSandboxProvider } from "./sandbox/local-provider.js";
|
|
36
|
+
export { ShellBackedFileSystem } from "./sandbox/shell-backed-fs.js";
|
|
33
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,8EAA8E;AAC9E,cAAc,iBAAiB,CAAC;AAEhC,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEnF,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wFAAwF;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAItM,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AActE,0CAA0C;AAC1C,OAAO,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,WAAW;AACX,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEvD,iBAAiB;AACjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1H,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,8EAA8E;AAC9E,cAAc,iBAAiB,CAAC;AAEhC,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEnF,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wFAAwF;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAItM,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AActE,0CAA0C;AAC1C,OAAO,EACL,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,WAAW;AACX,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEvD,iBAAiB;AACjB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1H,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,4EAA4E;AAC5E,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SandboxLease — a per-run lease over a {@link SandboxProvider} that adds the
|
|
3
|
+
* three things the proxy execution model needs on top of a raw session:
|
|
4
|
+
*
|
|
5
|
+
* - LAZY ACQUIRE: the session opens on the first fs/shell operation, so a run
|
|
6
|
+
* whose loop only reasons/talks never opens one (nothing to bill).
|
|
7
|
+
* - INTRA-RUN SUSPEND: a refcount tracks in-flight fs/shell ops; when it hits
|
|
8
|
+
* zero the compute is suspended after `idleSuspendMs` (the model is
|
|
9
|
+
* thinking), and resumed on the next op. Parallel ops share one sandbox and
|
|
10
|
+
* one resume, and it is never suspended mid-operation. No-op when the
|
|
11
|
+
* session has no {@link SandboxLifecycle} (e.g. the local machine).
|
|
12
|
+
* - METERING: the acquire→release window minus suspended gaps is the run's
|
|
13
|
+
* real sandbox-milliseconds, emitted once via `onUsage` on dispose.
|
|
14
|
+
*
|
|
15
|
+
* This generalises the cloud's Sandbox-object lease to the {@link FileSystem}
|
|
16
|
+
* and {@link Shell} ports, so any backend (local, docker, daytona, remote)
|
|
17
|
+
* gets the same behaviour behind one port.
|
|
18
|
+
*/
|
|
19
|
+
import type { FileSystem, Shell, SandboxProvider, SandboxUsage } from "@polpo-ai/core";
|
|
20
|
+
/** Default idle window before an unused sandbox's compute is suspended. */
|
|
21
|
+
export declare const DEFAULT_IDLE_SUSPEND_MS = 1500;
|
|
22
|
+
export interface SandboxLeaseOptions {
|
|
23
|
+
/** Clock injection for testing. */
|
|
24
|
+
now?: () => number;
|
|
25
|
+
/** Called once on dispose with the run's sandbox usage. */
|
|
26
|
+
onUsage?: (usage: SandboxUsage) => void;
|
|
27
|
+
/** Idle window (ms) before suspending compute. Default 1500. */
|
|
28
|
+
idleSuspendMs?: number;
|
|
29
|
+
/** Project id propagated into the emitted usage. */
|
|
30
|
+
projectId?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class SandboxLease {
|
|
33
|
+
private readonly provider;
|
|
34
|
+
private readonly runId;
|
|
35
|
+
private sessionPromise;
|
|
36
|
+
private session;
|
|
37
|
+
private lifecycle?;
|
|
38
|
+
private acquired;
|
|
39
|
+
private inFlight;
|
|
40
|
+
private running;
|
|
41
|
+
private runningSince;
|
|
42
|
+
private runningMs;
|
|
43
|
+
private idleTimer;
|
|
44
|
+
private resumeLock;
|
|
45
|
+
private released;
|
|
46
|
+
private readonly now;
|
|
47
|
+
private readonly onUsage?;
|
|
48
|
+
private readonly idleSuspendMs;
|
|
49
|
+
private readonly projectId?;
|
|
50
|
+
/** Activity-wrapped filesystem — hand this to the in-process tool ports. */
|
|
51
|
+
readonly fs: FileSystem;
|
|
52
|
+
/** Activity-wrapped shell — hand this to the in-process tool ports. */
|
|
53
|
+
readonly shell: Shell;
|
|
54
|
+
constructor(provider: SandboxProvider, runId: string, opts?: SandboxLeaseOptions);
|
|
55
|
+
/** Whether the run ever opened a session. */
|
|
56
|
+
get wasAcquired(): boolean;
|
|
57
|
+
private ensureSession;
|
|
58
|
+
/** Release the sandbox and emit usage. Idempotent. */
|
|
59
|
+
dispose(): Promise<void>;
|
|
60
|
+
private activityStart;
|
|
61
|
+
private activityEnd;
|
|
62
|
+
/** Resume the compute on demand; a single resume is shared by parallel ops. */
|
|
63
|
+
private ensureRunning;
|
|
64
|
+
private armIdle;
|
|
65
|
+
private clearIdle;
|
|
66
|
+
private suspend;
|
|
67
|
+
/** Open (lazily), bracket a fs/shell op with the refcount, and run it. */
|
|
68
|
+
private bracket;
|
|
69
|
+
private makeFs;
|
|
70
|
+
private makeShell;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.d.ts","sourceRoot":"","sources":["../../src/sandbox/lease.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EACV,UAAU,EACV,KAAK,EAEL,eAAe,EAGf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAExB,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IA0BrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IA1BxB,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IAEpC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAGH,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM,EAC9B,IAAI,GAAE,mBAAwB;IAUhC,6CAA6C;IAC7C,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID,OAAO,CAAC,aAAa;IAcrB,sDAAsD;IAChD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBhB,aAAa;IAM3B,OAAO,CAAC,WAAW;IAKnB,+EAA+E;YACjE,aAAa;IAa3B,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,SAAS;YAOH,OAAO;IAcrB,0EAA0E;YAC5D,OAAO;IAerB,OAAO,CAAC,MAAM;IA2Bd,OAAO,CAAC,SAAS;CAKlB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/** Default idle window before an unused sandbox's compute is suspended. */
|
|
2
|
+
export const DEFAULT_IDLE_SUSPEND_MS = 1500;
|
|
3
|
+
export class SandboxLease {
|
|
4
|
+
provider;
|
|
5
|
+
runId;
|
|
6
|
+
sessionPromise = null;
|
|
7
|
+
session = null;
|
|
8
|
+
lifecycle;
|
|
9
|
+
acquired = false;
|
|
10
|
+
inFlight = 0;
|
|
11
|
+
running = false;
|
|
12
|
+
runningSince = 0;
|
|
13
|
+
runningMs = 0;
|
|
14
|
+
idleTimer = null;
|
|
15
|
+
resumeLock = null;
|
|
16
|
+
released = false;
|
|
17
|
+
now;
|
|
18
|
+
onUsage;
|
|
19
|
+
idleSuspendMs;
|
|
20
|
+
projectId;
|
|
21
|
+
/** Activity-wrapped filesystem — hand this to the in-process tool ports. */
|
|
22
|
+
fs;
|
|
23
|
+
/** Activity-wrapped shell — hand this to the in-process tool ports. */
|
|
24
|
+
shell;
|
|
25
|
+
constructor(provider, runId, opts = {}) {
|
|
26
|
+
this.provider = provider;
|
|
27
|
+
this.runId = runId;
|
|
28
|
+
this.now = opts.now ?? (() => Date.now());
|
|
29
|
+
this.onUsage = opts.onUsage;
|
|
30
|
+
this.idleSuspendMs = opts.idleSuspendMs ?? DEFAULT_IDLE_SUSPEND_MS;
|
|
31
|
+
this.projectId = opts.projectId;
|
|
32
|
+
this.fs = this.makeFs();
|
|
33
|
+
this.shell = this.makeShell();
|
|
34
|
+
}
|
|
35
|
+
/** Whether the run ever opened a session. */
|
|
36
|
+
get wasAcquired() {
|
|
37
|
+
return this.acquired;
|
|
38
|
+
}
|
|
39
|
+
// ── session lifecycle ──────────────────────────────────────────────────
|
|
40
|
+
ensureSession() {
|
|
41
|
+
if (!this.sessionPromise) {
|
|
42
|
+
this.sessionPromise = Promise.resolve(this.provider.open(this.runId)).then((s) => {
|
|
43
|
+
this.session = s;
|
|
44
|
+
this.lifecycle = s.lifecycle;
|
|
45
|
+
this.acquired = true;
|
|
46
|
+
this.running = true;
|
|
47
|
+
this.runningSince = this.now();
|
|
48
|
+
return s;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return this.sessionPromise;
|
|
52
|
+
}
|
|
53
|
+
/** Release the sandbox and emit usage. Idempotent. */
|
|
54
|
+
async dispose() {
|
|
55
|
+
if (this.released)
|
|
56
|
+
return;
|
|
57
|
+
this.released = true;
|
|
58
|
+
this.clearIdle();
|
|
59
|
+
if (this.running) {
|
|
60
|
+
this.runningMs += this.now() - this.runningSince;
|
|
61
|
+
this.running = false;
|
|
62
|
+
}
|
|
63
|
+
let sandboxId;
|
|
64
|
+
if (this.session) {
|
|
65
|
+
try {
|
|
66
|
+
sandboxId = this.session.usage?.().sandboxId;
|
|
67
|
+
}
|
|
68
|
+
catch { /* ignore */ }
|
|
69
|
+
try {
|
|
70
|
+
await this.session.dispose();
|
|
71
|
+
}
|
|
72
|
+
catch { /* best-effort */ }
|
|
73
|
+
}
|
|
74
|
+
this.onUsage?.({
|
|
75
|
+
runId: this.runId,
|
|
76
|
+
projectId: this.projectId,
|
|
77
|
+
acquired: this.acquired,
|
|
78
|
+
sandboxMs: this.acquired ? Math.max(0, this.runningMs) : 0,
|
|
79
|
+
sandboxId,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// ── activity tracking ──────────────────────────────────────────────────
|
|
83
|
+
async activityStart() {
|
|
84
|
+
this.clearIdle();
|
|
85
|
+
this.inFlight++;
|
|
86
|
+
if (!this.running)
|
|
87
|
+
await this.ensureRunning();
|
|
88
|
+
}
|
|
89
|
+
activityEnd() {
|
|
90
|
+
this.inFlight = Math.max(0, this.inFlight - 1);
|
|
91
|
+
if (this.inFlight === 0)
|
|
92
|
+
this.armIdle();
|
|
93
|
+
}
|
|
94
|
+
/** Resume the compute on demand; a single resume is shared by parallel ops. */
|
|
95
|
+
async ensureRunning() {
|
|
96
|
+
if (this.running || !this.lifecycle)
|
|
97
|
+
return;
|
|
98
|
+
if (!this.resumeLock) {
|
|
99
|
+
const lc = this.lifecycle;
|
|
100
|
+
this.resumeLock = lc.resume().then(() => {
|
|
101
|
+
this.running = true;
|
|
102
|
+
this.runningSince = this.now();
|
|
103
|
+
this.resumeLock = null;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
await this.resumeLock;
|
|
107
|
+
}
|
|
108
|
+
armIdle() {
|
|
109
|
+
if (!this.lifecycle || this.released)
|
|
110
|
+
return;
|
|
111
|
+
this.clearIdle();
|
|
112
|
+
this.idleTimer = setTimeout(() => { void this.suspend(); }, this.idleSuspendMs);
|
|
113
|
+
// Never keep the process alive just to suspend an idle sandbox.
|
|
114
|
+
this.idleTimer.unref?.();
|
|
115
|
+
}
|
|
116
|
+
clearIdle() {
|
|
117
|
+
if (this.idleTimer) {
|
|
118
|
+
clearTimeout(this.idleTimer);
|
|
119
|
+
this.idleTimer = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async suspend() {
|
|
123
|
+
if (this.inFlight > 0 || !this.running || !this.lifecycle || this.released)
|
|
124
|
+
return;
|
|
125
|
+
this.running = false;
|
|
126
|
+
this.runningMs += this.now() - this.runningSince;
|
|
127
|
+
try {
|
|
128
|
+
await this.lifecycle.suspend();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Suspend failed — treat as still running so metering stays honest and
|
|
132
|
+
// the next op doesn't try to resume an already-running sandbox.
|
|
133
|
+
this.running = true;
|
|
134
|
+
this.runningSince = this.now();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Open (lazily), bracket a fs/shell op with the refcount, and run it. */
|
|
138
|
+
async bracket(op) {
|
|
139
|
+
const session = await this.ensureSession();
|
|
140
|
+
await this.activityStart();
|
|
141
|
+
try {
|
|
142
|
+
return await op(session);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
this.activityEnd();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── activity-wrapped ports ──────────────────────────────────────────────
|
|
149
|
+
// The optional FileSystem methods are always present on the lease (callers
|
|
150
|
+
// may feature-detect them) and fall back to the required methods when the
|
|
151
|
+
// backend doesn't implement them — same fallbacks the file routes use.
|
|
152
|
+
makeFs() {
|
|
153
|
+
const enc = new TextEncoder();
|
|
154
|
+
const dec = new TextDecoder();
|
|
155
|
+
return {
|
|
156
|
+
readFile: (p) => this.bracket((s) => s.fs.readFile(p)),
|
|
157
|
+
writeFile: (p, c) => this.bracket((s) => s.fs.writeFile(p, c)),
|
|
158
|
+
exists: (p) => this.bracket((s) => s.fs.exists(p)),
|
|
159
|
+
readdir: (p) => this.bracket((s) => s.fs.readdir(p)),
|
|
160
|
+
mkdir: (p) => this.bracket((s) => s.fs.mkdir(p)),
|
|
161
|
+
remove: (p) => this.bracket((s) => s.fs.remove(p)),
|
|
162
|
+
stat: (p) => this.bracket((s) => s.fs.stat(p)),
|
|
163
|
+
rename: (o, n) => this.bracket((s) => s.fs.rename(o, n)),
|
|
164
|
+
readdirWithTypes: (p) => this.bracket((s) => s.fs.readdirWithTypes
|
|
165
|
+
? s.fs.readdirWithTypes(p)
|
|
166
|
+
: s.fs.readdir(p).then((names) => names.map((name) => ({ name, isDirectory: false, isFile: true })))),
|
|
167
|
+
readFileBuffer: (p) => this.bracket((s) => s.fs.readFileBuffer ? s.fs.readFileBuffer(p) : s.fs.readFile(p).then((t) => enc.encode(t))),
|
|
168
|
+
writeFileBuffer: (p, d) => this.bracket((s) => s.fs.writeFileBuffer ? s.fs.writeFileBuffer(p, d) : s.fs.writeFile(p, dec.decode(d))),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
makeShell() {
|
|
172
|
+
return {
|
|
173
|
+
execute: (cmd, opts) => this.bracket((s) => s.shell.execute(cmd, opts)),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease.js","sourceRoot":"","sources":["../../src/sandbox/lease.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LocalSandboxProvider — runs a session directly on the host machine.
|
|
3
|
+
*
|
|
4
|
+
* The default provider for self-hosted mode: a session is just the real
|
|
5
|
+
* {@link NodeFileSystem} + {@link NodeShell}, with NO lifecycle (the local
|
|
6
|
+
* machine has no meaningful suspend) and NO metering. Under a
|
|
7
|
+
* {@link SandboxLease} this means the lease never suspends and behaves exactly
|
|
8
|
+
* as running the tools directly — i.e. identical to today's local execution.
|
|
9
|
+
*/
|
|
10
|
+
import type { SandboxProvider, SandboxSession } from "@polpo-ai/core";
|
|
11
|
+
export declare class LocalSandboxProvider implements SandboxProvider {
|
|
12
|
+
open(_runId: string): SandboxSession;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=local-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../src/sandbox/local-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAItE,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;CAWrC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NodeFileSystem } from "../adapters/node-filesystem.js";
|
|
2
|
+
import { NodeShell } from "../adapters/node-shell.js";
|
|
3
|
+
export class LocalSandboxProvider {
|
|
4
|
+
open(_runId) {
|
|
5
|
+
return {
|
|
6
|
+
fs: new NodeFileSystem(),
|
|
7
|
+
shell: new NodeShell(),
|
|
8
|
+
// no lifecycle → the lease never suspends (nothing to suspend locally)
|
|
9
|
+
// no usage() → nothing metered locally
|
|
10
|
+
async dispose() {
|
|
11
|
+
/* nothing to release on the local machine */
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=local-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../src/sandbox/local-provider.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,OAAO,oBAAoB;IAC/B,IAAI,CAAC,MAAc;QACjB,OAAO;YACL,EAAE,EAAE,IAAI,cAAc,EAAE;YACxB,KAAK,EAAE,IAAI,SAAS,EAAE;YACtB,uEAAuE;YACvE,yCAAyC;YACzC,KAAK,CAAC,OAAO;gBACX,6CAA6C;YAC/C,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShellBackedFileSystem — a {@link FileSystem} implemented entirely over a
|
|
3
|
+
* {@link Shell}. Metadata ops map to coreutils (`test`, `mkdir`, `rm`, `mv`,
|
|
4
|
+
* `ls`, `find`, `stat`); data ops move bytes through `base64` so binary content
|
|
5
|
+
* survives the shell round-trip.
|
|
6
|
+
*
|
|
7
|
+
* This is the reusable core of any shell-only sandbox backend (Docker `exec`,
|
|
8
|
+
* a remote VM's `run`, …): give it a Shell and it becomes a full FileSystem,
|
|
9
|
+
* no backend-specific file API required. Backends with a native file-transfer
|
|
10
|
+
* primitive (Daytona `fs.uploadFile`, Arker `sync`) should override the data
|
|
11
|
+
* ops for efficiency; this class is the portable fallback.
|
|
12
|
+
*
|
|
13
|
+
* Assumes GNU coreutils (`find -printf`, `stat -c`) — i.e. a Linux container,
|
|
14
|
+
* which is the case for every sandbox backend. `base64`-over-argv also caps the
|
|
15
|
+
* practical single-file size at the shell's ARG_MAX; large binaries want a
|
|
16
|
+
* native transfer primitive.
|
|
17
|
+
*/
|
|
18
|
+
import type { FileSystem, FileEntry, FileStat, Shell } from "@polpo-ai/core";
|
|
19
|
+
export declare class ShellBackedFileSystem implements FileSystem {
|
|
20
|
+
private readonly shell;
|
|
21
|
+
constructor(shell: Shell);
|
|
22
|
+
readFile(path: string): Promise<string>;
|
|
23
|
+
readFileBuffer(path: string): Promise<Uint8Array>;
|
|
24
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
25
|
+
writeFileBuffer(path: string, data: Uint8Array): Promise<void>;
|
|
26
|
+
exists(path: string): Promise<boolean>;
|
|
27
|
+
mkdir(path: string): Promise<void>;
|
|
28
|
+
remove(path: string): Promise<void>;
|
|
29
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
30
|
+
readdir(path: string): Promise<string[]>;
|
|
31
|
+
readdirWithTypes(path: string): Promise<FileEntry[]>;
|
|
32
|
+
stat(path: string): Promise<FileStat>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=shell-backed-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-backed-fs.d.ts","sourceRoot":"","sources":["../../src/sandbox/shell-backed-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAO7E,qBAAa,qBAAsB,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMjD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAapD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAoB5C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** Single-quote a string for safe interpolation into a shell command. */
|
|
2
|
+
function shq(s) {
|
|
3
|
+
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
4
|
+
}
|
|
5
|
+
export class ShellBackedFileSystem {
|
|
6
|
+
shell;
|
|
7
|
+
constructor(shell) {
|
|
8
|
+
this.shell = shell;
|
|
9
|
+
}
|
|
10
|
+
async readFile(path) {
|
|
11
|
+
return new TextDecoder().decode(await this.readFileBuffer(path));
|
|
12
|
+
}
|
|
13
|
+
async readFileBuffer(path) {
|
|
14
|
+
const r = await this.shell.execute(`base64 ${shq(path)}`);
|
|
15
|
+
if (r.exitCode !== 0)
|
|
16
|
+
throw new Error(`readFile ${path}: ${r.stderr.trim() || "failed"}`);
|
|
17
|
+
return Uint8Array.from(Buffer.from(r.stdout, "base64"));
|
|
18
|
+
}
|
|
19
|
+
async writeFile(path, content) {
|
|
20
|
+
await this.writeFileBuffer(path, new TextEncoder().encode(content));
|
|
21
|
+
}
|
|
22
|
+
async writeFileBuffer(path, data) {
|
|
23
|
+
const b64 = Buffer.from(data).toString("base64");
|
|
24
|
+
const r = await this.shell.execute(`printf '%s' ${shq(b64)} | base64 -d > ${shq(path)}`);
|
|
25
|
+
if (r.exitCode !== 0)
|
|
26
|
+
throw new Error(`writeFile ${path}: ${r.stderr.trim() || "failed"}`);
|
|
27
|
+
}
|
|
28
|
+
async exists(path) {
|
|
29
|
+
return (await this.shell.execute(`test -e ${shq(path)}`)).exitCode === 0;
|
|
30
|
+
}
|
|
31
|
+
async mkdir(path) {
|
|
32
|
+
const r = await this.shell.execute(`mkdir -p ${shq(path)}`);
|
|
33
|
+
if (r.exitCode !== 0)
|
|
34
|
+
throw new Error(`mkdir ${path}: ${r.stderr.trim() || "failed"}`);
|
|
35
|
+
}
|
|
36
|
+
async remove(path) {
|
|
37
|
+
await this.shell.execute(`rm -rf ${shq(path)}`);
|
|
38
|
+
}
|
|
39
|
+
async rename(oldPath, newPath) {
|
|
40
|
+
const r = await this.shell.execute(`mv ${shq(oldPath)} ${shq(newPath)}`);
|
|
41
|
+
if (r.exitCode !== 0)
|
|
42
|
+
throw new Error(`rename ${oldPath} → ${newPath}: ${r.stderr.trim() || "failed"}`);
|
|
43
|
+
}
|
|
44
|
+
async readdir(path) {
|
|
45
|
+
const r = await this.shell.execute(`ls -1A ${shq(path)}`);
|
|
46
|
+
return r.exitCode === 0 ? r.stdout.split("\n").filter(Boolean) : [];
|
|
47
|
+
}
|
|
48
|
+
async readdirWithTypes(path) {
|
|
49
|
+
// `find` one level deep with a type marker: "d\t<name>" or "f\t<name>".
|
|
50
|
+
const r = await this.shell.execute(`find ${shq(path)} -mindepth 1 -maxdepth 1 -printf '%y\\t%f\\n' 2>/dev/null`);
|
|
51
|
+
if (r.exitCode !== 0)
|
|
52
|
+
return [];
|
|
53
|
+
return r.stdout.split("\n").filter(Boolean).map((line) => {
|
|
54
|
+
const [ty, name] = line.split("\t");
|
|
55
|
+
const isDirectory = ty === "d";
|
|
56
|
+
return { name: name ?? "", isDirectory, isFile: !isDirectory };
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async stat(path) {
|
|
60
|
+
// Numeric size + mtime (locale-independent), then a d/f type marker via
|
|
61
|
+
// `test -d`. `stat -c`'s `%F` is localized ("regular file" / "file
|
|
62
|
+
// regolare") and `-c` does not interpret `\n`, so avoid both. The `&&`
|
|
63
|
+
// makes a missing path fail (stat's non-zero exit propagates).
|
|
64
|
+
const p = shq(path);
|
|
65
|
+
const r = await this.shell.execute(`stat --printf='%s %Y ' ${p} && ( [ -d ${p} ] && echo d || echo f )`);
|
|
66
|
+
if (r.exitCode !== 0)
|
|
67
|
+
throw new Error(`stat ${path}: not found`);
|
|
68
|
+
const [sizeStr, mtimeStr, kind] = r.stdout.trim().split(/\s+/);
|
|
69
|
+
const isDirectory = kind === "d";
|
|
70
|
+
const mtime = Number(mtimeStr);
|
|
71
|
+
return {
|
|
72
|
+
size: Number(sizeStr) || 0,
|
|
73
|
+
isDirectory,
|
|
74
|
+
isFile: !isDirectory,
|
|
75
|
+
modifiedAt: Number.isFinite(mtime) ? new Date(mtime * 1000) : undefined,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=shell-backed-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-backed-fs.js","sourceRoot":"","sources":["../../src/sandbox/shell-backed-fs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polpo-ai/node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Polpo Node.js runtime — orchestrator wiring, adapters, server assembly, runner entry. The composition root behind the polpo-ai package.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
"nanoid": "^5.1.2",
|
|
45
45
|
"yaml": "^2.7.0",
|
|
46
46
|
"zod": "^4.3.6",
|
|
47
|
-
"@polpo-ai/
|
|
48
|
-
"@polpo-ai/llm": "0.
|
|
49
|
-
"@polpo-ai/
|
|
50
|
-
"@polpo-ai/
|
|
51
|
-
"@polpo-ai/tools": "0.
|
|
52
|
-
"@polpo-ai/
|
|
47
|
+
"@polpo-ai/server": "0.14.0",
|
|
48
|
+
"@polpo-ai/llm": "0.14.0",
|
|
49
|
+
"@polpo-ai/vault-crypto": "0.14.0",
|
|
50
|
+
"@polpo-ai/core": "0.14.0",
|
|
51
|
+
"@polpo-ai/tools": "0.14.0",
|
|
52
|
+
"@polpo-ai/file-stores": "0.14.0"
|
|
53
53
|
},
|
|
54
54
|
"optionalDependencies": {
|
|
55
55
|
"better-sqlite3": "^12.6.2",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"nodemailer": "^8.0.1",
|
|
58
58
|
"playwright-core": "^1.52.0",
|
|
59
59
|
"postgres": "^3.4.0",
|
|
60
|
-
"@polpo-ai/drizzle": "0.
|
|
60
|
+
"@polpo-ai/drizzle": "0.14.0"
|
|
61
61
|
},
|
|
62
62
|
"license": "MIT",
|
|
63
63
|
"repository": {
|