@dynamicagents/plugins 0.12.0 → 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/README.md +58 -77
- package/dist/browser/index.d.ts +0 -2
- package/dist/browser/index.js +21 -27
- package/dist/claude-code/cards.d.ts +55 -0
- package/dist/claude-code/cards.js +283 -0
- package/dist/claude-code/config.d.ts +28 -63
- package/dist/claude-code/config.js +0 -11
- package/dist/claude-code/egress.d.ts +8 -1
- package/dist/claude-code/egress.js +42 -4
- package/dist/claude-code/events.d.ts +106 -9
- package/dist/claude-code/events.js +201 -56
- package/dist/claude-code/github.d.ts +39 -0
- package/dist/claude-code/github.js +82 -0
- package/dist/claude-code/index.d.ts +16 -90
- package/dist/claude-code/index.js +14 -276
- package/dist/claude-code/model.d.ts +152 -0
- package/dist/claude-code/model.js +366 -0
- package/dist/claude-code/run.d.ts +230 -116
- package/dist/claude-code/run.js +380 -167
- package/dist/claude-code/session.d.ts +131 -0
- package/dist/claude-code/session.js +288 -0
- package/dist/claude-code/spec.d.ts +46 -0
- package/dist/claude-code/spec.js +83 -0
- package/dist/claude-code/verified.d.ts +15 -0
- package/dist/claude-code/verified.js +15 -0
- package/dist/computer/context.d.ts +1 -5
- package/dist/computer/context.js +7 -10
- package/dist/computer/file-lock.js +5 -4
- package/dist/computer/gate.d.ts +4 -4
- package/dist/computer/gate.js +5 -5
- package/dist/computer/index.d.ts +40 -258
- package/dist/computer/index.js +71 -324
- package/dist/computer/paths.d.ts +36 -16
- package/dist/computer/paths.js +42 -29
- package/dist/computer/proxy.d.ts +45 -0
- package/dist/computer/proxy.js +234 -0
- package/dist/computer/render.d.ts +1 -40
- package/dist/computer/render.js +2 -68
- package/dist/computer/tools-exec.js +12 -13
- package/dist/computer/tools-file.d.ts +9 -1
- package/dist/computer/tools-file.js +22 -82
- package/dist/computer/{tools-find.d.ts → tools-grep.d.ts} +1 -1
- package/dist/computer/tools-grep.js +129 -0
- package/dist/repo/checkout.d.ts +4 -5
- package/dist/repo/checkout.js +31 -8
- package/dist/repo/context.d.ts +35 -9
- package/dist/repo/context.js +101 -49
- package/dist/repo/index.d.ts +73 -28
- package/dist/repo/index.js +112 -96
- package/dist/repo/tools-checks.d.ts +3 -0
- package/dist/repo/tools-checks.js +112 -0
- package/dist/repo/tools-clone.js +1 -1
- package/dist/repo/tools-pr.d.ts +14 -0
- package/dist/repo/{tools-forge.js → tools-pr.js} +53 -36
- package/dist/repo/tools-review.d.ts +9 -0
- package/dist/repo/tools-review.js +67 -47
- package/dist/repo/tools-worktree.js +144 -60
- package/dist/repo/tools-worktrees.d.ts +12 -0
- package/dist/repo/tools-worktrees.js +48 -0
- package/dist/repo/url.d.ts +2 -2
- package/dist/repo/url.js +7 -7
- package/dist/scratch/index.d.ts +4 -4
- package/dist/scratch/index.js +12 -11
- package/dist/{computer → workspace}/advisory.d.ts +4 -4
- package/dist/{computer → workspace}/advisory.js +2 -2
- package/dist/{computer/host → workspace}/ca-trust.d.ts +8 -1
- package/dist/{computer/host → workspace}/ca-trust.js +12 -3
- package/dist/{computer/host → workspace}/container-deps.d.ts +4 -0
- package/dist/{computer/host → workspace}/container-deps.js +26 -1
- package/dist/{computer/host → workspace}/container-fault.d.ts +3 -3
- package/dist/{computer/host → workspace}/container-fault.js +23 -8
- package/dist/workspace/deps-snapshot.d.ts +110 -0
- package/dist/workspace/deps-snapshot.js +424 -0
- package/dist/workspace/exec.d.ts +94 -0
- package/dist/workspace/exec.js +153 -0
- package/dist/workspace/format.d.ts +36 -0
- package/dist/workspace/format.js +57 -0
- package/dist/{computer/host → workspace}/git-host.d.ts +21 -4
- package/dist/{computer/host → workspace}/git-host.js +72 -2
- package/dist/{computer/host → workspace}/git-identity.d.ts +1 -1
- package/dist/{computer/host → workspace}/git-identity.js +1 -1
- package/dist/workspace/index.d.ts +44 -47
- package/dist/workspace/index.js +52 -112
- package/dist/{computer/host → workspace}/install-job.d.ts +53 -4
- package/dist/{computer/host → workspace}/install-job.js +346 -178
- package/dist/{computer → workspace}/install.d.ts +17 -8
- package/dist/{computer → workspace}/install.js +24 -6
- package/dist/{computer/host/workspace.d.ts → workspace/object.d.ts} +125 -27
- package/dist/{computer/host/workspace.js → workspace/object.js} +341 -58
- package/dist/workspace/open.d.ts +95 -0
- package/dist/workspace/open.js +63 -0
- package/dist/workspace/read.d.ts +16 -0
- package/dist/workspace/read.js +22 -0
- package/dist/{computer → workspace}/shell.d.ts +5 -5
- package/dist/{computer → workspace}/shell.js +6 -6
- package/dist/{computer/host → workspace}/wake.d.ts +3 -1
- package/package.json +17 -37
- package/dist/arc-agi/analysis.d.ts +0 -322
- package/dist/arc-agi/analysis.js +0 -802
- package/dist/arc-agi/client.d.ts +0 -82
- package/dist/arc-agi/client.js +0 -113
- package/dist/arc-agi/game-tools.d.ts +0 -24
- package/dist/arc-agi/game-tools.js +0 -26
- package/dist/arc-agi/index.d.ts +0 -40
- package/dist/arc-agi/index.js +0 -175
- package/dist/arc-agi/main-agent.d.ts +0 -24
- package/dist/arc-agi/main-agent.js +0 -62
- package/dist/arc-agi/recipe.d.ts +0 -48
- package/dist/arc-agi/recipe.js +0 -97
- package/dist/arc-agi/scorecard.d.ts +0 -118
- package/dist/arc-agi/scorecard.js +0 -163
- package/dist/arc-agi/soul.d.ts +0 -29
- package/dist/arc-agi/soul.js +0 -79
- package/dist/arc-agi/store.d.ts +0 -153
- package/dist/arc-agi/store.js +0 -215
- package/dist/arc-agi/tools.d.ts +0 -36
- package/dist/arc-agi/tools.js +0 -574
- package/dist/arc-agi/types.d.ts +0 -211
- package/dist/arc-agi/types.js +0 -19
- package/dist/claude-code/recipe.d.ts +0 -53
- package/dist/claude-code/recipe.js +0 -100
- package/dist/computer/read.d.ts +0 -133
- package/dist/computer/read.js +0 -200
- package/dist/computer/tools-find.js +0 -216
- package/dist/recall/index.d.ts +0 -105
- package/dist/recall/index.js +0 -181
- package/dist/repo/tools-forge.d.ts +0 -4
- package/dist/triage/index.d.ts +0 -360
- package/dist/triage/index.js +0 -311
- /package/dist/{computer/host → workspace}/sync.d.ts +0 -0
- /package/dist/{computer/host → workspace}/sync.js +0 -0
- /package/dist/{computer/host → workspace}/wake.js +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { WorkspaceClient, WorkspaceStub } from "@cloudflare/computer";
|
|
2
|
+
import type { WorkspaceAdvisory } from "./advisory.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reaching a workspace: which one a call names, and the two ways to open it.
|
|
5
|
+
*
|
|
6
|
+
* A leaf, so the object, `/computer`'s tools and its proxy in
|
|
7
|
+
* `../computer/proxy.ts` can import it without
|
|
8
|
+
* going through the barrel that re-exports them.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Where a parent puts the workspace name so its sub-agents reach the same one.
|
|
12
|
+
*
|
|
13
|
+
* A sub-agent cannot compute this itself. The name is derived from the caller
|
|
14
|
+
* and the repository, and the checkout it should work in is one its parent
|
|
15
|
+
* chose — so a sub-agent that named its own would land beside the parent's
|
|
16
|
+
* checkout, in a workspace with nothing in it.
|
|
17
|
+
*
|
|
18
|
+
* A spec's `prepare` runs on the parent, where the name resolves, and its
|
|
19
|
+
* return value reaches the sub-agent's plugins as `runtime()`. That is the
|
|
20
|
+
* channel core built for exactly this, and it is emphatically *not* the
|
|
21
|
+
* sub-agent's input, which the parent's model writes — a workspace name there
|
|
22
|
+
* would be model-authored, and a model naming another caller's workspace would
|
|
23
|
+
* get that caller's files.
|
|
24
|
+
*/
|
|
25
|
+
export declare const WORKSPACE_RUNTIME_KEY = "workspaceName";
|
|
26
|
+
/**
|
|
27
|
+
* Read a parent-resolved workspace name off a sub-agent's `runtime()`.
|
|
28
|
+
*
|
|
29
|
+
* Returns `undefined` rather than throwing on anything unexpected: a parent has
|
|
30
|
+
* no runtime at all, and falling back to the configured thunk is right there.
|
|
31
|
+
*/
|
|
32
|
+
export declare function workspaceNameFromRuntime(runtime: unknown): string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* The Durable Object the workspace lives in, as this plugin needs to see it.
|
|
35
|
+
*
|
|
36
|
+
* Structural rather than imported: the class is the host's — it owns the
|
|
37
|
+
* container binding, the alarm and the install job — and a plugin that imported
|
|
38
|
+
* it would stop a second host from bringing its own. `__getWorkspaceStub` is the
|
|
39
|
+
* one method `getWorkspace()` calls across the boundary, and it is what
|
|
40
|
+
* `withWorkspace` installs (or what a host that constructs `Workspace` itself
|
|
41
|
+
* reimplements, which is the same three lines).
|
|
42
|
+
*/
|
|
43
|
+
export interface WorkspaceHost extends Rpc.DurableObjectBranded {
|
|
44
|
+
__getWorkspaceStub(): Promise<WorkspaceStub>;
|
|
45
|
+
/**
|
|
46
|
+
* The same workspace for filesystem-only work, which the host must serve
|
|
47
|
+
* **without starting a container**.
|
|
48
|
+
*
|
|
49
|
+
* The filesystem is the Durable Object's own SQLite, while the first command
|
|
50
|
+
* in a fresh container waits for the whole tree to be pushed into it — so a
|
|
51
|
+
* file tool served the other way waits minutes for a local `readdir`. See
|
|
52
|
+
* `WorkspaceObjectBase.__getWorkspaceFsStub` in `./object.ts`.
|
|
53
|
+
*
|
|
54
|
+
* Required rather than optional, for the reason {@link advisories} gives. A
|
|
55
|
+
* host with nothing to distinguish returns its own `__getWorkspaceStub()`.
|
|
56
|
+
*/
|
|
57
|
+
__getWorkspaceFsStub(): Promise<WorkspaceStub>;
|
|
58
|
+
/**
|
|
59
|
+
* Everything currently true about the workspace that a caller must not assume
|
|
60
|
+
* away — see {@link file://./advisory.ts}. An empty array is the good case.
|
|
61
|
+
*
|
|
62
|
+
* Required rather than optional, and not only because Workers RPC types an
|
|
63
|
+
* optional method as a union nothing can call. A host with nothing to report
|
|
64
|
+
* returns `[]` in one line; a host that forgot to expose it gets a compile
|
|
65
|
+
* error instead of a `bash` that silently runs against a half-built
|
|
66
|
+
* `node_modules`, or against a workspace whose writes are being dropped.
|
|
67
|
+
*
|
|
68
|
+
* `deriveAdvisories` builds the array from what the host already knows, so
|
|
69
|
+
* implementing this is gathering what the host has rather than writing policy.
|
|
70
|
+
*/
|
|
71
|
+
advisories(): Promise<readonly WorkspaceAdvisory[]>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Open the workspace behind a Durable Object stub.
|
|
75
|
+
*
|
|
76
|
+
* The cast is unavoidable, and narrow enough to be worth isolating here rather
|
|
77
|
+
* than repeating. `getWorkspace` wants a handle whose `__getWorkspaceStub()`
|
|
78
|
+
* resolves to a `WorkspaceStub` — the concrete class, private fields and all.
|
|
79
|
+
* Across a Durable Object boundary Workers RPC hands back a structural
|
|
80
|
+
* `Stub<WorkspaceStub>`, which forwards every method faithfully but carries none
|
|
81
|
+
* of the class's private brand: runtime-compatible, type-incompatible. This is
|
|
82
|
+
* the only place in the plugin that gap is crossed.
|
|
83
|
+
*/
|
|
84
|
+
export declare function openWorkspace(host: DurableObjectStub<WorkspaceHost>): Promise<WorkspaceClient>;
|
|
85
|
+
/**
|
|
86
|
+
* The same workspace, opened for filesystem work alone.
|
|
87
|
+
*
|
|
88
|
+
* `getWorkspace` calls exactly one method on what it is handed, so the host is
|
|
89
|
+
* wrapped in an object answering it from the other side of the seam — see
|
|
90
|
+
* {@link WorkspaceHost.__getWorkspaceFsStub}. Everything past that is identical.
|
|
91
|
+
*
|
|
92
|
+
* **Only the file tools take this.** `bash` and `workspaceExec` need the
|
|
93
|
+
* container started and its CA installed, so they open it the other way.
|
|
94
|
+
*/
|
|
95
|
+
export declare function openWorkspaceFs(host: DurableObjectStub<WorkspaceHost>): Promise<WorkspaceClient>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getWorkspace } from "@cloudflare/computer";
|
|
2
|
+
/**
|
|
3
|
+
* Reaching a workspace: which one a call names, and the two ways to open it.
|
|
4
|
+
*
|
|
5
|
+
* A leaf, so the object, `/computer`'s tools and its proxy in
|
|
6
|
+
* `../computer/proxy.ts` can import it without
|
|
7
|
+
* going through the barrel that re-exports them.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Where a parent puts the workspace name so its sub-agents reach the same one.
|
|
11
|
+
*
|
|
12
|
+
* A sub-agent cannot compute this itself. The name is derived from the caller
|
|
13
|
+
* and the repository, and the checkout it should work in is one its parent
|
|
14
|
+
* chose — so a sub-agent that named its own would land beside the parent's
|
|
15
|
+
* checkout, in a workspace with nothing in it.
|
|
16
|
+
*
|
|
17
|
+
* A spec's `prepare` runs on the parent, where the name resolves, and its
|
|
18
|
+
* return value reaches the sub-agent's plugins as `runtime()`. That is the
|
|
19
|
+
* channel core built for exactly this, and it is emphatically *not* the
|
|
20
|
+
* sub-agent's input, which the parent's model writes — a workspace name there
|
|
21
|
+
* would be model-authored, and a model naming another caller's workspace would
|
|
22
|
+
* get that caller's files.
|
|
23
|
+
*/
|
|
24
|
+
export const WORKSPACE_RUNTIME_KEY = "workspaceName";
|
|
25
|
+
/**
|
|
26
|
+
* Read a parent-resolved workspace name off a sub-agent's `runtime()`.
|
|
27
|
+
*
|
|
28
|
+
* Returns `undefined` rather than throwing on anything unexpected: a parent has
|
|
29
|
+
* no runtime at all, and falling back to the configured thunk is right there.
|
|
30
|
+
*/
|
|
31
|
+
export function workspaceNameFromRuntime(runtime) {
|
|
32
|
+
const value = runtime?.[WORKSPACE_RUNTIME_KEY];
|
|
33
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Open the workspace behind a Durable Object stub.
|
|
37
|
+
*
|
|
38
|
+
* The cast is unavoidable, and narrow enough to be worth isolating here rather
|
|
39
|
+
* than repeating. `getWorkspace` wants a handle whose `__getWorkspaceStub()`
|
|
40
|
+
* resolves to a `WorkspaceStub` — the concrete class, private fields and all.
|
|
41
|
+
* Across a Durable Object boundary Workers RPC hands back a structural
|
|
42
|
+
* `Stub<WorkspaceStub>`, which forwards every method faithfully but carries none
|
|
43
|
+
* of the class's private brand: runtime-compatible, type-incompatible. This is
|
|
44
|
+
* the only place in the plugin that gap is crossed.
|
|
45
|
+
*/
|
|
46
|
+
export function openWorkspace(host) {
|
|
47
|
+
return getWorkspace(host);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The same workspace, opened for filesystem work alone.
|
|
51
|
+
*
|
|
52
|
+
* `getWorkspace` calls exactly one method on what it is handed, so the host is
|
|
53
|
+
* wrapped in an object answering it from the other side of the seam — see
|
|
54
|
+
* {@link WorkspaceHost.__getWorkspaceFsStub}. Everything past that is identical.
|
|
55
|
+
*
|
|
56
|
+
* **Only the file tools take this.** `bash` and `workspaceExec` need the
|
|
57
|
+
* container started and its CA installed, so they open it the other way.
|
|
58
|
+
*/
|
|
59
|
+
export function openWorkspaceFs(host) {
|
|
60
|
+
return getWorkspace({
|
|
61
|
+
__getWorkspaceStub: () => host.__getWorkspaceFsStub()
|
|
62
|
+
});
|
|
63
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorkspaceClient } from "@cloudflare/computer";
|
|
2
|
+
/**
|
|
3
|
+
* Does this path exist?
|
|
4
|
+
*
|
|
5
|
+
* `getWorkspace()` types `fs` as the in-process `WorkspaceFilesystem`, but the
|
|
6
|
+
* value on the far side of a Durable Object boundary is a
|
|
7
|
+
* `WorkspaceFilesystemStub`, which carries a few methods the local class does
|
|
8
|
+
* not — `exists` among them. So the fast path is asked for rather than cast to,
|
|
9
|
+
* and `stat` is the fallback for a host that hands back a local workspace.
|
|
10
|
+
*
|
|
11
|
+
* The fallback treats *any* `stat` failure as absence, which is the honest
|
|
12
|
+
* reading for a tool whose entire answer is a boolean: there is no error channel
|
|
13
|
+
* to distinguish "missing" from "unreadable", and the caller's next move — look
|
|
14
|
+
* somewhere else — is the same either way.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pathExists(fs: WorkspaceClient["fs"], path: string): Promise<boolean>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this path exist?
|
|
3
|
+
*
|
|
4
|
+
* `getWorkspace()` types `fs` as the in-process `WorkspaceFilesystem`, but the
|
|
5
|
+
* value on the far side of a Durable Object boundary is a
|
|
6
|
+
* `WorkspaceFilesystemStub`, which carries a few methods the local class does
|
|
7
|
+
* not — `exists` among them. So the fast path is asked for rather than cast to,
|
|
8
|
+
* and `stat` is the fallback for a host that hands back a local workspace.
|
|
9
|
+
*
|
|
10
|
+
* The fallback treats *any* `stat` failure as absence, which is the honest
|
|
11
|
+
* reading for a tool whose entire answer is a boolean: there is no error channel
|
|
12
|
+
* to distinguish "missing" from "unreadable", and the caller's next move — look
|
|
13
|
+
* somewhere else — is the same either way.
|
|
14
|
+
*/
|
|
15
|
+
export async function pathExists(fs, path) {
|
|
16
|
+
// Called as a method, never through `.call`: on an RPC stub `.call` is read as
|
|
17
|
+
// a remote method, and the stub it would pass as `this` cannot be serialised.
|
|
18
|
+
const remote = fs;
|
|
19
|
+
if (typeof remote.exists === "function")
|
|
20
|
+
return remote.exists(path);
|
|
21
|
+
return fs.stat(path).then(() => true, () => false);
|
|
22
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Run a command under {@link file://./
|
|
2
|
+
* Run a command under {@link file://./exec.ts WorkspaceClientConfig.shell} with its
|
|
3
3
|
* two output streams left as they are, or hand it back untouched when no shell
|
|
4
4
|
* is configured.
|
|
5
5
|
*
|
|
6
6
|
* This is the variant for a caller that **reads the result in code**: `stdout` is
|
|
7
7
|
* a data channel it compares or parses, and `stderr` is a separate diagnostic.
|
|
8
|
-
* {@link file://./
|
|
8
|
+
* {@link file://./exec.ts workspaceExec} is that caller, on behalf of
|
|
9
9
|
* `@dynamicagents/plugins/repo`, which asks git questions like
|
|
10
10
|
* `symbolic-ref --short refs/remotes/origin/HEAD` and `rev-list --count` and
|
|
11
11
|
* needs the answer alone.
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function withShell(command: string, shell: string | undefined): string;
|
|
21
21
|
/**
|
|
22
|
-
* Run a command under {@link file://./
|
|
22
|
+
* Run a command under {@link file://./exec.ts WorkspaceClientConfig.shell} with its
|
|
23
23
|
* two output streams merged into one transcript, in the order they were
|
|
24
24
|
* written.
|
|
25
25
|
*
|
|
26
26
|
* This is the variant for a caller whose consumer is **a model reading output**.
|
|
27
|
-
* `
|
|
27
|
+
* `bash` is that caller. A project's check is a chain — `wrangler types &&
|
|
28
28
|
* prettier && eslint && tsc` — and *which tool spoke last* is how you know which
|
|
29
29
|
* one failed. A stdout block and a separate stderr block destroy that ordering,
|
|
30
30
|
* and a model that wants it back re-runs the whole gate as
|
|
@@ -38,7 +38,7 @@ export declare function withShell(command: string, shell: string | undefined): s
|
|
|
38
38
|
*
|
|
39
39
|
* With no shell configured there is no wrapper process to redirect, so the
|
|
40
40
|
* command goes to the runtime untouched and the two streams arrive separate.
|
|
41
|
-
* That is not a gap: {@link file
|
|
41
|
+
* That is not a gap: {@link file://../computer/render.ts renderResult} renders them as a
|
|
42
42
|
* labelled `--- stderr ---` block for exactly this case. The transcript is the
|
|
43
43
|
* better answer, not the only supported one.
|
|
44
44
|
*/
|
|
@@ -23,20 +23,20 @@ import { shellQuote } from "@cloudflare/computer";
|
|
|
23
23
|
* truncated with both ends kept.
|
|
24
24
|
*
|
|
25
25
|
* Requires a shell that implements it — `bash`, `zsh`, `ksh`, not `sh`/dash. A
|
|
26
|
-
* host setting {@link file://./
|
|
26
|
+
* host setting {@link file://./exec.ts WorkspaceClientConfig.shell} is choosing that
|
|
27
27
|
* shell explicitly.
|
|
28
28
|
*/
|
|
29
29
|
function wrapped(command, shell) {
|
|
30
30
|
return `${shell} -o pipefail -c ${shellQuote(command)}`;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* Run a command under {@link file://./
|
|
33
|
+
* Run a command under {@link file://./exec.ts WorkspaceClientConfig.shell} with its
|
|
34
34
|
* two output streams left as they are, or hand it back untouched when no shell
|
|
35
35
|
* is configured.
|
|
36
36
|
*
|
|
37
37
|
* This is the variant for a caller that **reads the result in code**: `stdout` is
|
|
38
38
|
* a data channel it compares or parses, and `stderr` is a separate diagnostic.
|
|
39
|
-
* {@link file://./
|
|
39
|
+
* {@link file://./exec.ts workspaceExec} is that caller, on behalf of
|
|
40
40
|
* `@dynamicagents/plugins/repo`, which asks git questions like
|
|
41
41
|
* `symbolic-ref --short refs/remotes/origin/HEAD` and `rev-list --count` and
|
|
42
42
|
* needs the answer alone.
|
|
@@ -52,12 +52,12 @@ export function withShell(command, shell) {
|
|
|
52
52
|
return shell ? wrapped(command, shell) : command;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Run a command under {@link file://./
|
|
55
|
+
* Run a command under {@link file://./exec.ts WorkspaceClientConfig.shell} with its
|
|
56
56
|
* two output streams merged into one transcript, in the order they were
|
|
57
57
|
* written.
|
|
58
58
|
*
|
|
59
59
|
* This is the variant for a caller whose consumer is **a model reading output**.
|
|
60
|
-
* `
|
|
60
|
+
* `bash` is that caller. A project's check is a chain — `wrangler types &&
|
|
61
61
|
* prettier && eslint && tsc` — and *which tool spoke last* is how you know which
|
|
62
62
|
* one failed. A stdout block and a separate stderr block destroy that ordering,
|
|
63
63
|
* and a model that wants it back re-runs the whole gate as
|
|
@@ -71,7 +71,7 @@ export function withShell(command, shell) {
|
|
|
71
71
|
*
|
|
72
72
|
* With no shell configured there is no wrapper process to redirect, so the
|
|
73
73
|
* command goes to the runtime untouched and the two streams arrive separate.
|
|
74
|
-
* That is not a gap: {@link file
|
|
74
|
+
* That is not a gap: {@link file://../computer/render.ts renderResult} renders them as a
|
|
75
75
|
* labelled `--- stderr ---` block for exactly this case. The transcript is the
|
|
76
76
|
* better answer, not the only supported one.
|
|
77
77
|
*/
|
|
@@ -12,8 +12,10 @@ export type WorkspaceWakeHandlers = {
|
|
|
12
12
|
installRun: () => Promise<void>;
|
|
13
13
|
installWatch: () => Promise<void>;
|
|
14
14
|
idleReclaim: () => Promise<void>;
|
|
15
|
-
/** Start a cold container before a command needs it — see `./
|
|
15
|
+
/** Start a cold container before a command needs it — see `./object.ts`. */
|
|
16
16
|
containerWarm: () => Promise<void>;
|
|
17
|
+
/** Snapshot a container that just installed — see `./deps-snapshot.ts`. */
|
|
18
|
+
depsSnapshot: () => Promise<void>;
|
|
17
19
|
containerIdle: (payload?: SyncDrainIntent) => Promise<void>;
|
|
18
20
|
syncRetry: (payload?: SyncDrainIntent) => Promise<void>;
|
|
19
21
|
};
|
package/package.json
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamicagents/plugins",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Optional, composable capabilities for a Dynamic Agent:
|
|
3
|
+
"version": "0.14.0",
|
|
4
|
+
"description": "Optional, composable capabilities for a Dynamic Agent: browser rendering, a Linux container, git and pull requests, a scratchpad, and Claude Code sessions. One subpath per plugin, so a bundle grows only with what it imports.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
7
7
|
"cloudflare-workers",
|
|
8
8
|
"durable-objects",
|
|
9
9
|
"agents-sdk",
|
|
10
|
-
"arc-agi",
|
|
11
|
-
"vectorize",
|
|
12
10
|
"browser-rendering",
|
|
13
11
|
"containers",
|
|
14
12
|
"git",
|
|
@@ -32,26 +30,10 @@
|
|
|
32
30
|
"LICENSE"
|
|
33
31
|
],
|
|
34
32
|
"exports": {
|
|
35
|
-
"./arc-agi": {
|
|
36
|
-
"types": "./dist/arc-agi/index.d.ts",
|
|
37
|
-
"import": "./dist/arc-agi/index.js"
|
|
38
|
-
},
|
|
39
33
|
"./browser": {
|
|
40
34
|
"types": "./dist/browser/index.d.ts",
|
|
41
35
|
"import": "./dist/browser/index.js"
|
|
42
36
|
},
|
|
43
|
-
"./workspace": {
|
|
44
|
-
"types": "./dist/workspace/index.d.ts",
|
|
45
|
-
"import": "./dist/workspace/index.js"
|
|
46
|
-
},
|
|
47
|
-
"./recall": {
|
|
48
|
-
"types": "./dist/recall/index.d.ts",
|
|
49
|
-
"import": "./dist/recall/index.js"
|
|
50
|
-
},
|
|
51
|
-
"./triage": {
|
|
52
|
-
"types": "./dist/triage/index.d.ts",
|
|
53
|
-
"import": "./dist/triage/index.js"
|
|
54
|
-
},
|
|
55
37
|
"./repo": {
|
|
56
38
|
"types": "./dist/repo/index.d.ts",
|
|
57
39
|
"import": "./dist/repo/index.js"
|
|
@@ -64,6 +46,10 @@
|
|
|
64
46
|
"types": "./dist/claude-code/index.d.ts",
|
|
65
47
|
"import": "./dist/claude-code/index.js"
|
|
66
48
|
},
|
|
49
|
+
"./workspace": {
|
|
50
|
+
"types": "./dist/workspace/index.d.ts",
|
|
51
|
+
"import": "./dist/workspace/index.js"
|
|
52
|
+
},
|
|
67
53
|
"./computer": {
|
|
68
54
|
"types": "./dist/computer/index.d.ts",
|
|
69
55
|
"import": "./dist/computer/index.js"
|
|
@@ -80,29 +66,24 @@
|
|
|
80
66
|
"check": "npm run verify:peer-ranges && npm run verify:references && npm run types:check && prettier --check . && eslint . && tsc && npm run build && npm run verify:exports",
|
|
81
67
|
"test": "vitest run",
|
|
82
68
|
"test:watch": "vitest",
|
|
83
|
-
"test:record": "RECORD=1 vitest run recorded.spec.ts",
|
|
84
69
|
"verify:exports": "node scripts/verify-exports.mjs",
|
|
85
70
|
"verify:references": "node scripts/verify-references.mjs",
|
|
86
71
|
"verify:peer-ranges": "node scripts/verify-peer-ranges.mjs",
|
|
72
|
+
"probe:claude-code": "npm run build && node scripts/probe-claude-code.mjs",
|
|
87
73
|
"prepack": "npm run build && npm run verify:exports",
|
|
88
74
|
"prepublishOnly": "npm run check && npm test",
|
|
89
75
|
"prepare": "husky || true && npm run build"
|
|
90
76
|
},
|
|
91
77
|
"peerDependencies": {
|
|
92
|
-
"@cloudflare/computer": "^0.
|
|
93
|
-
"@cloudflare/
|
|
94
|
-
"@dynamicagents/core": ">=0.
|
|
95
|
-
"@platformatic/vfs": "^0.
|
|
96
|
-
"agents": ">=0.
|
|
78
|
+
"@cloudflare/computer": "^0.5.0",
|
|
79
|
+
"@cloudflare/think": ">=0.20.2 <0.21.0",
|
|
80
|
+
"@dynamicagents/core": ">=0.14.0 <0.15.0",
|
|
81
|
+
"@platformatic/vfs": "^0.5.0",
|
|
82
|
+
"agents": ">=0.28.0 <0.29.0",
|
|
97
83
|
"ai": "^7.0.88",
|
|
98
|
-
"drizzle-orm": ">=0.45.2",
|
|
99
|
-
"workers-ai-provider": "^4.0.0",
|
|
100
84
|
"zod": "^4.4.3"
|
|
101
85
|
},
|
|
102
86
|
"peerDependenciesMeta": {
|
|
103
|
-
"@cloudflare/shell": {
|
|
104
|
-
"optional": true
|
|
105
|
-
},
|
|
106
87
|
"@cloudflare/computer": {
|
|
107
88
|
"optional": true
|
|
108
89
|
},
|
|
@@ -111,15 +92,14 @@
|
|
|
111
92
|
}
|
|
112
93
|
},
|
|
113
94
|
"devDependencies": {
|
|
114
|
-
"@cloudflare/computer": "^0.
|
|
115
|
-
"@cloudflare/
|
|
116
|
-
"@platformatic/vfs": "^0.4.0",
|
|
95
|
+
"@cloudflare/computer": "^0.5.0",
|
|
96
|
+
"@cloudflare/think": "^0.20.2",
|
|
117
97
|
"@cloudflare/vitest-plugin": "^1.1.9",
|
|
118
|
-
"@dynamicagents/core": "^0.
|
|
98
|
+
"@dynamicagents/core": "^0.14.0",
|
|
99
|
+
"@platformatic/vfs": "^0.5.0",
|
|
119
100
|
"@types/node": "^26.5.1",
|
|
120
|
-
"agents": "^0.
|
|
101
|
+
"agents": "^0.28.0",
|
|
121
102
|
"ai": "^7.0.101",
|
|
122
|
-
"drizzle-orm": ">=0.45.2",
|
|
123
103
|
"eslint": "^10.10.0",
|
|
124
104
|
"husky": "^9.1.7",
|
|
125
105
|
"prettier": "^3.9.6",
|