@cursor/july 0.1.103 → 0.1.105
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/channels/change-monitors/change-monitors-channel.d.ts +5 -0
- package/dist/channels/change-monitors/change-monitors-channel.d.ts.map +1 -0
- package/dist/channels/change-monitors/change-monitors-channel.js +41 -0
- package/dist/channels/change-monitors/index.d.ts +4 -0
- package/dist/channels/change-monitors/index.d.ts.map +1 -0
- package/dist/channels/change-monitors/index.js +2 -0
- package/dist/channels/change-monitors/types.d.ts +39 -0
- package/dist/channels/change-monitors/types.d.ts.map +1 -0
- package/dist/channels/change-monitors/types.js +1 -0
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -0
- package/dist/channels/deployments/types.d.ts +2 -0
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/defaults.d.ts.map +1 -1
- package/dist/channels/github/defaults.js +4 -0
- package/dist/channels/github/progress.d.ts +22 -0
- package/dist/channels/github/progress.d.ts.map +1 -1
- package/dist/channels/github/progress.js +32 -5
- package/dist/channels/issues/index.d.ts +4 -0
- package/dist/channels/issues/index.d.ts.map +1 -0
- package/dist/channels/issues/index.js +2 -0
- package/dist/channels/issues/issues-channel.d.ts +5 -0
- package/dist/channels/issues/issues-channel.d.ts.map +1 -0
- package/dist/channels/issues/issues-channel.js +37 -0
- package/dist/channels/issues/types.d.ts +33 -0
- package/dist/channels/issues/types.d.ts.map +1 -0
- package/dist/channels/issues/types.js +1 -0
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.DW9pXkpL.js → app.BVwaffdK.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CdEIUwDg.js → VPLocalSearchBox.WuWTZ1x8.js} +1 -1
- package/dist/docs/assets/chunks/{theme.YZMHgPgg.js → theme.BYdI_6sF.js} +2 -2
- package/dist/docs/assets/{guides_github.md.DKYiT9do.js → guides_github.md.c0gdGJ-D.js} +1 -1
- package/dist/docs/assets/{guides_github.md.DKYiT9do.lean.js → guides_github.md.c0gdGJ-D.lean.js} +1 -1
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.js +9 -0
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.lean.js +1 -0
- package/dist/docs/assets/index.md.BW_6tOgR.js +5 -0
- package/dist/docs/assets/index.md.BW_6tOgR.lean.js +1 -0
- package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.js → reference_channels.md.DBGcaB7m.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.lean.js → reference_channels.md.DBGcaB7m.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CJNc_xYK.js → reference_cli.md.C6Lo8SEd.js} +2 -1
- package/dist/docs/assets/{reference_extensions.md.DykHW3qL.js → reference_extensions.md.CGmMLblt.js} +1 -1
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +3 -0
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/design/filesystem.md +376 -0
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-agents.html +5 -5
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +6 -6
- package/dist/docs/guides/github.md +5 -0
- package/dist/docs/guides/grokbot-agents.html +35 -0
- package/dist/docs/guides/grokbot-agents.md +88 -0
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +4 -4
- package/dist/docs/guides/opentelemetry.html +5 -5
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +6 -1
- package/dist/docs/llms-full.txt +562 -2
- package/dist/docs/llms.txt +3 -0
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +6 -6
- package/dist/docs/reference/channels.md +20 -0
- package/dist/docs/reference/cli.html +7 -6
- package/dist/docs/reference/cli.md +2 -1
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/extensions.html +6 -6
- package/dist/docs/reference/extensions.md +2 -0
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/result.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/ab.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/evals.html +4 -4
- package/dist/docs/skills/framework-map.html +4 -4
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +4 -4
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +4 -4
- package/dist/docs/skills/setup-slack.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +5 -5
- package/dist/docs/templates/demo.html +5 -5
- package/dist/docs/templates/grokbot-agents.html +29 -0
- package/dist/docs/templates/grokbot-agents.md +48 -0
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/files.d.ts +7 -2
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +7 -2
- package/dist/filesystem.d.ts +440 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +1694 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/continuation-channel.d.ts +4 -2
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +21 -12
- package/dist/internal/continuation-identity.d.ts +13 -5
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +74 -35
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +80 -8
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +3 -0
- package/dist/internal/factory-resource-channel.d.ts +33 -0
- package/dist/internal/factory-resource-channel.d.ts.map +1 -0
- package/dist/internal/factory-resource-channel.js +77 -0
- package/dist/internal/filesystem/errors.d.ts +64 -0
- package/dist/internal/filesystem/errors.d.ts.map +1 -0
- package/dist/internal/filesystem/errors.js +175 -0
- package/dist/internal/filesystem/format.d.ts +28 -0
- package/dist/internal/filesystem/format.d.ts.map +1 -0
- package/dist/internal/filesystem/format.js +213 -0
- package/dist/internal/filesystem/merge.d.ts +34 -0
- package/dist/internal/filesystem/merge.d.ts.map +1 -0
- package/dist/internal/filesystem/merge.js +196 -0
- package/dist/internal/filesystem/scratch.d.ts +59 -0
- package/dist/internal/filesystem/scratch.d.ts.map +1 -0
- package/dist/internal/filesystem/scratch.js +212 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts +29 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -0
- package/dist/internal/filesystem/sdk-schemas.js +153 -0
- package/dist/internal/filesystem/tools.d.ts +42 -0
- package/dist/internal/filesystem/tools.d.ts.map +1 -0
- package/dist/internal/filesystem/tools.js +618 -0
- package/dist/internal/filesystem/walk.d.ts +74 -0
- package/dist/internal/filesystem/walk.d.ts.map +1 -0
- package/dist/internal/filesystem/walk.js +339 -0
- package/dist/internal/framework-file-storage.d.ts +3 -1
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +3 -1
- package/dist/internal/guest-network.d.ts +5 -2
- package/dist/internal/guest-network.d.ts.map +1 -1
- package/dist/internal/guest-network.js +7 -2
- package/dist/internal/hosted-delivery.d.ts +7 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +41 -3
- package/dist/internal/hosted-managed-automation.d.ts.map +1 -1
- package/dist/internal/hosted-managed-automation.js +27 -2
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -1
- package/dist/internal/sdk-runner.d.ts +13 -1
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +21 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +11 -3
- package/dist/internal/session-engine.d.ts +30 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +484 -82
- package/dist/internal/store-mirror.d.ts +2 -2
- package/dist/internal/store-mirror.js +2 -2
- package/dist/internal/tenant-slack/relay.d.ts +2 -0
- package/dist/internal/tenant-slack/relay.d.ts.map +1 -1
- package/dist/internal/tenant-slack/relay.js +18 -8
- package/dist/internal/testing/factory-resource-fixtures.d.ts +48 -0
- package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/factory-resource-fixtures.js +41 -0
- package/dist/internal/workspace-sync.d.ts +31 -6
- package/dist/internal/workspace-sync.d.ts.map +1 -1
- package/dist/internal/workspace-sync.js +67 -12
- package/dist/internal/workspace.d.ts +9 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +16 -0
- package/dist/playground/assets/{index-59KvgREd.js → index-BaQzjaNK.js} +40 -40
- package/dist/playground/assets/index-CceqnLTX.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +60 -11
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +6 -1
- package/docs/design/filesystem.md +376 -0
- package/docs/guides/github.md +5 -0
- package/docs/guides/grokbot-agents.md +93 -0
- package/docs/reference/channels.md +20 -0
- package/docs/reference/cli.md +2 -1
- package/docs/reference/extensions.md +2 -0
- package/docs/templates/grokbot-agents.md +53 -0
- package/package.json +25 -2
- package/src/channels/change-monitors/change-monitors-channel.ts +62 -0
- package/src/channels/change-monitors/index.ts +8 -0
- package/src/channels/change-monitors/types.ts +44 -0
- package/src/channels/deployments/deployments-channel.ts +1 -0
- package/src/channels/deployments/types.ts +2 -0
- package/src/channels/github/defaults.ts +4 -0
- package/src/channels/github/progress.ts +76 -10
- package/src/channels/issues/index.ts +9 -0
- package/src/channels/issues/issues-channel.ts +51 -0
- package/src/channels/issues/types.ts +41 -0
- package/src/files.ts +9 -2
- package/src/filesystem.ts +2074 -0
- package/src/index.ts +28 -0
- package/src/internal/continuation-channel.ts +29 -12
- package/src/internal/continuation-identity.ts +122 -37
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/discovery/agent.ts +87 -1
- package/src/internal/discovery/info.ts +3 -0
- package/src/internal/factory-resource-channel.ts +122 -0
- package/src/internal/filesystem/errors.ts +220 -0
- package/src/internal/filesystem/format.ts +276 -0
- package/src/internal/filesystem/merge.ts +195 -0
- package/src/internal/filesystem/scratch.ts +255 -0
- package/src/internal/filesystem/sdk-schemas.ts +204 -0
- package/src/internal/filesystem/tools.ts +821 -0
- package/src/internal/filesystem/walk.ts +369 -0
- package/src/internal/framework-file-storage.ts +3 -1
- package/src/internal/guest-network.ts +8 -2
- package/src/internal/hosted-delivery.ts +71 -2
- package/src/internal/hosted-managed-automation.ts +49 -5
- package/src/internal/init-project.ts +4 -1
- package/src/internal/sdk-runner.ts +23 -0
- package/src/internal/server.ts +16 -0
- package/src/internal/session-engine.ts +595 -73
- package/src/internal/store-mirror.ts +2 -2
- package/src/internal/tenant-slack/relay.ts +28 -4
- package/src/internal/testing/factory-resource-fixtures.ts +85 -0
- package/src/internal/workspace-sync.ts +84 -12
- package/src/internal/workspace.ts +20 -0
- package/src/types.ts +58 -11
- package/templates/grokbot-agents/README.md +26 -0
- package/templates/grokbot-agents/agent/agent.ts +6 -0
- package/templates/grokbot-agents/agent/extensions/grokbot.ts +5 -0
- package/templates/grokbot-agents/agent/instructions.md +7 -0
- package/templates/grokbot-agents/evals/evals.config.ts +5 -0
- package/templates/grokbot-agents/evals/grokbot-agents.eval.ts +18 -0
- package/templates/grokbot-agents/init.json +18 -0
- package/templates/grokbot-agents/package.json +17 -0
- package/templates/grokbot-agents/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +0 -1
- package/dist/docs/assets/index.md.D75GWhPl.js +0 -5
- package/dist/docs/assets/index.md.D75GWhPl.lean.js +0 -1
- package/dist/playground/assets/index-MbMxXg-y.css +0 -1
- /package/dist/docs/assets/{reference_cli.md.CJNc_xYK.lean.js → reference_cli.md.C6Lo8SEd.lean.js} +0 -0
- /package/dist/docs/assets/{reference_extensions.md.DykHW3qL.lean.js → reference_extensions.md.CGmMLblt.lean.js} +0 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# One FileSystem for every Agent SDK agent
|
|
2
|
+
|
|
3
|
+
> **Status:** first implementation, this PR. `@cursor/july` only.
|
|
4
|
+
> No Cursor SDK change.
|
|
5
|
+
> **Audience:** Agent SDK maintainers.
|
|
6
|
+
|
|
7
|
+
Every local turn binds a **FileSystem** and synthesizes native file
|
|
8
|
+
tools from it. There is no "is there an override?" branch on the
|
|
9
|
+
tool path. Authors pick the tree with `root`. Omit `root` and the
|
|
10
|
+
tree is the host disk, through internal `localFileSystem`.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
// Host disk. Relative paths resolve against the harness cwd.
|
|
14
|
+
export default defineAgent({
|
|
15
|
+
name: "reviewer",
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Override. The model sees only this tree. Paths are posix `/`.
|
|
19
|
+
export default defineAgent({
|
|
20
|
+
name: "notes",
|
|
21
|
+
root: tempFs({ "/notes.md": "hello" }),
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Names
|
|
28
|
+
|
|
29
|
+
| Name | Kind | Meaning |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `FileSystem` | Type on `@cursor/july` | Path verbs. Authors provide this. |
|
|
32
|
+
| `root` | Field on `defineAgent` | The FileSystem the agent runs on. Omit it and the root is the host disk. |
|
|
33
|
+
|
|
34
|
+
No `root()` method and no public `Workspace` type.
|
|
35
|
+
`local.workspaceDir` stays the harness cwd. `workspaceFiles` stays
|
|
36
|
+
per-send seed files. Those names are not the path namespace.
|
|
37
|
+
|
|
38
|
+
Do not pass `local.root` into `Agent.create`. The published SDK
|
|
39
|
+
does not have that field.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## FileSystem
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
interface FileSystem {
|
|
47
|
+
list(prefix?: string): AsyncIterable<DirEntry>;
|
|
48
|
+
stat(path: string): Promise<FileInfo>;
|
|
49
|
+
glob(pattern: string, dir?: string): AsyncIterable<DirEntry>;
|
|
50
|
+
read(path: string): Promise<string | Uint8Array>;
|
|
51
|
+
grep(query: GrepQuery): AsyncIterable<GrepResult>;
|
|
52
|
+
write(path: string, contents: string): Promise<void>;
|
|
53
|
+
delete(path: string): Promise<void>;
|
|
54
|
+
search(query: SearchQuery): AsyncIterable<SearchResult>;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Every method is required. A tree without an index yields nothing
|
|
59
|
+
from `search`. Methods do not fall back to the host tree.
|
|
60
|
+
Diagnostics are not a FileSystem verb.
|
|
61
|
+
|
|
62
|
+
Path verbs take a path (and contents for `write`). Bags with two
|
|
63
|
+
or more independent options (`grep`, `search`) take a
|
|
64
|
+
named query object.
|
|
65
|
+
|
|
66
|
+
`read` returns text as a string, or image bytes as a
|
|
67
|
+
`Uint8Array` (`jpeg` / `png` / `gif` / `webp`). Native Read
|
|
68
|
+
applies `offset` / `limit` and numbers lines on text. Images
|
|
69
|
+
become a base64 image content part, the same shape the Cursor
|
|
70
|
+
harness sends the model.
|
|
71
|
+
|
|
72
|
+
FileSystem methods throw; they do not return a status envelope.
|
|
73
|
+
`@cursor/july` does not export `FileSystemResult`.
|
|
74
|
+
|
|
75
|
+
### Paths
|
|
76
|
+
|
|
77
|
+
Authored `root` (`tempFs`, `unionFs`, `overlayFs`, `hostFs`, a custom tree) is one posix
|
|
78
|
+
namespace rooted at `/`. Query paths and yielded paths are
|
|
79
|
+
absolute (`/src/a.ts`). No trailing slash except `/`. `""`, `"/"`,
|
|
80
|
+
and an omitted optional scope mean the root. Prefix tests are
|
|
81
|
+
path-segment: `/agent` matches `/agent/skills`, not
|
|
82
|
+
`/agent-tools`. `normalizeFsPath` resolves `..`. `/tmp` is
|
|
83
|
+
reserved for turn-local scratch. See `/tmp` scratch.
|
|
84
|
+
|
|
85
|
+
Host-default `localFileSystem` follows Cursor SDK natives:
|
|
86
|
+
relative paths resolve against the harness cwd; absolute paths
|
|
87
|
+
are used as-is. Yielded paths are host paths, not rewritten to
|
|
88
|
+
`/`. `search` is empty (no host index).
|
|
89
|
+
|
|
90
|
+
### Iterators
|
|
91
|
+
|
|
92
|
+
Async iterators are already sorted. `unionFs` k-way merges them
|
|
93
|
+
and does not re-sort a source.
|
|
94
|
+
|
|
95
|
+
- `list` / `glob`: lexicographic by `path`. Paths are unique.
|
|
96
|
+
- `grep`: by `path`, then `lineNumber` ascending. Keep every hit.
|
|
97
|
+
- `search`: by `score` descending, then `path` ascending.
|
|
98
|
+
|
|
99
|
+
A file is not under itself, so listing a file path is empty.
|
|
100
|
+
Empty `list` is not "missing"; `stat` answers that.
|
|
101
|
+
|
|
102
|
+
`glob(pattern, dir?)` matches relative to `dir`, not
|
|
103
|
+
basename-anywhere (`*.ts` under `/src` is `/src/a.ts`, not
|
|
104
|
+
`/src/nested/c.ts`).
|
|
105
|
+
|
|
106
|
+
`grep` has no `output_mode` or `offset`. A slash-free `glob`
|
|
107
|
+
(`*.ts`) matches the basename at any depth under `path`.
|
|
108
|
+
`grep` / `search` take optional `maxResults` as predicate
|
|
109
|
+
pushdown; implementations should stop after that many hits.
|
|
110
|
+
Composers push the same cap to children and apply it again
|
|
111
|
+
after the merge.
|
|
112
|
+
|
|
113
|
+
Native-tool pagination (`head_limit`, `offset`, `output_mode`,
|
|
114
|
+
`numResults`) stays on synthesized tools. Native `LS` is built
|
|
115
|
+
from `list` + `stat`; there is no `ls` method.
|
|
116
|
+
|
|
117
|
+
### Errors
|
|
118
|
+
|
|
119
|
+
FileSystem methods throw `PathError`. `path` is the absolute
|
|
120
|
+
posix path the error is about. Messages stay these contract
|
|
121
|
+
strings so synthesized tools can show them as-is.
|
|
122
|
+
|
|
123
|
+
- `list` / `stat` / `glob` must not throw for a missing path.
|
|
124
|
+
Missing is an empty iterator or `{ kind: "missing" }`.
|
|
125
|
+
- `read` / `delete` missing file: `FileNotFoundError`
|
|
126
|
+
(`not found: ${path}`).
|
|
127
|
+
- `write` has no `not found`. I/O uses the OS message or
|
|
128
|
+
`WriteFailedError` (`write failed: ${path}`). A read-only
|
|
129
|
+
mount uses `ReadOnlyMountError` (`read-only mount: ${path}`).
|
|
130
|
+
- Synthesized StrReplace is `read` + exact replace + `write`.
|
|
131
|
+
Uniqueness failures throw `EditError` (`oldText is empty`,
|
|
132
|
+
`oldText and newText are exactly the same`, `The string to
|
|
133
|
+
replace was not found in the file`, and `The string to replace
|
|
134
|
+
was found multiple times in the file. Use replace_all to replace
|
|
135
|
+
all occurrences, or include more context to only edit one
|
|
136
|
+
occurrence.`). Write-back failures are `WriteFailedError`.
|
|
137
|
+
- `grep` throws `InvalidGrepPatternError`
|
|
138
|
+
(`invalid grep pattern: ${pattern}`). A missing host search
|
|
139
|
+
root throws. A missing virtual path yields nothing.
|
|
140
|
+
- `search` without an index is empty success.
|
|
141
|
+
- `unionFs` with no mount throws `NoMountError`
|
|
142
|
+
(`no mount for path: ${path}`) on `read` / `write` /
|
|
143
|
+
`delete`. Walk verbs stay empty or missing.
|
|
144
|
+
- `unionFs` catches `PathError` from a child and rethrows
|
|
145
|
+
`error.withPath(mountPrefix + childPath)`. Untyped `Error` still
|
|
146
|
+
gets a best-effort message rewrite.
|
|
147
|
+
|
|
148
|
+
Invoke wraps FileSystem throws into the executor success / error
|
|
149
|
+
envelope.
|
|
150
|
+
|
|
151
|
+
### Write and StrReplace
|
|
152
|
+
|
|
153
|
+
`write(path, contents)` creates or overwrites a file. Success is
|
|
154
|
+
empty. Native Write maps `fileText` onto `contents` and prints
|
|
155
|
+
`Wrote contents to ${path}`.
|
|
156
|
+
|
|
157
|
+
StrReplace is not a FileSystem verb. The synthesized tool reads
|
|
158
|
+
the file, applies an exact non-overlapping replace, and writes
|
|
159
|
+
the result. It fails when `oldText` is empty, equals `newText`,
|
|
160
|
+
is missing, or occurs more than once without `replaceAll`.
|
|
161
|
+
Success is `{ occurrencesModified }`. Splice is literal; do not
|
|
162
|
+
use `String.prototype.replace`. Native aliases (`old_string`,
|
|
163
|
+
`new_string`, `replace_all`) map onto those fields at invoke
|
|
164
|
+
time.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Helpers
|
|
169
|
+
|
|
170
|
+
| Helper | Role |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| `emptyFs()` | No files. Overlay leaf or missing catalog. Reads miss; writes are read-only. |
|
|
173
|
+
| `tempFs(files)` | In-memory snapshot. Tests and fixtures. |
|
|
174
|
+
| `unionFs({ "/repo": a, "/plans": b })` | Longest-prefix compose, path-segment match. Children are FileSystems rooted at `/`; `unionFs` strips the mount prefix on the way in and re-prefixes yields. List and glob use `unique` so an earlier mount shadows a later one. Grep and search keep every hit. Grep and search at `/` fan out to every child. |
|
|
175
|
+
| `overlayFs([upper, lower])` | Same-root overlay. Earlier layers win. Read-only. A downed layer costs its own files, not the overlay — `stat` / `grep` / `search` only fail when no layer served. |
|
|
176
|
+
| `hostFs(files, scope)` | `HostFilesApi` as a FileSystem rooted at `/`. Mount with `unionFs({ "/host": hostFs(files, scope) })`. `search` is empty (no index). Write without a cached etag is unconditional; after a successful read or write, write is CAS on that etag. |
|
|
177
|
+
|
|
178
|
+
`localFileSystem({ cwd })` is the host-default handle. It is not
|
|
179
|
+
exported from `@cursor/july`. Name helpers and `mergeSorted`
|
|
180
|
+
stay private. `emptyFs`, `tempFs`, `unionFs`, `overlayFs`, `hostFs`, and
|
|
181
|
+
the `PathError` classes (`FileNotFoundError`,
|
|
182
|
+
`ReadOnlyMountError`, `NoMountError`, `InvalidGrepPatternError`,
|
|
183
|
+
`WriteFailedError`, `EditError`,
|
|
184
|
+
`DeleteNotSupportedError`) are the public helpers.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Tool synthesis
|
|
189
|
+
|
|
190
|
+
Local turns synthesize these natives from the bound FileSystem:
|
|
191
|
+
`Read`, `LS`, `Grep`, `Glob`, `Write`, `StrReplace`, `Delete`,
|
|
192
|
+
`SemanticSearch`. `list` + `stat` synthesize `LS`. `search`
|
|
193
|
+
synthesizes `SemanticSearch`. `StrReplace` is `read` + exact
|
|
194
|
+
replace + `write`. Other execute bodies call the matching
|
|
195
|
+
FileSystem method.
|
|
196
|
+
|
|
197
|
+
Authored `tools` can filter that set. `tools: ["read", "shell"]`
|
|
198
|
+
on a host-default agent synthesizes `Read` only.
|
|
199
|
+
`tools: ["edit"]` synthesizes `Write` and `StrReplace`.
|
|
200
|
+
`tools: ["semSearch"]` synthesizes `SemanticSearch`.
|
|
201
|
+
`tools: []` synthesizes nothing.
|
|
202
|
+
|
|
203
|
+
Host-default does not synthesize `SemanticSearch`. Native
|
|
204
|
+
`semSearch` stays on so the host index can run;
|
|
205
|
+
`localFileSystem.search` is empty. Authored `root` synthesizes
|
|
206
|
+
`SemanticSearch` from `FileSystem.search` and does not advertise
|
|
207
|
+
native `semSearch`. `search` is not an allowlist alias, so an
|
|
208
|
+
authored `search` tool is not treated as SemanticSearch.
|
|
209
|
+
`ReadLints` is not a FileSystem verb. Authored
|
|
210
|
+
`tools: ["readLints"]` fails closed so the host language service
|
|
211
|
+
cannot run.
|
|
212
|
+
|
|
213
|
+
Do not also ship `agent/tools/Read.ts` (and the other synthesized
|
|
214
|
+
names). Discovery fails closed on that clash for host-default and
|
|
215
|
+
authored `root`.
|
|
216
|
+
|
|
217
|
+
A factory root re-resolves the handle before a turn. The session
|
|
218
|
+
cache is the handle, not a tree snapshot. Unscoped `callTool`
|
|
219
|
+
uses the invocation id and does not cache, so factories cannot
|
|
220
|
+
share one tree across callers. A static `root` is the authored
|
|
221
|
+
object on every session — Write / StrReplace / Delete /
|
|
222
|
+
`workspaceFiles` are shared. Return a new handle from
|
|
223
|
+
`(ctx) => …` when a session should have its own tree. A factory
|
|
224
|
+
that returns the same object still shares.
|
|
225
|
+
|
|
226
|
+
Per-send `workspaceFiles` write through the FileSystem.
|
|
227
|
+
`memory/` is reserved (same as the host-default workspace
|
|
228
|
+
symlink into durable agent memory) and is refused after
|
|
229
|
+
normalize, including `./memory/x` and `foo/../memory/x`.
|
|
230
|
+
Host-default `list` / `glob` / `grep` do not follow directory
|
|
231
|
+
symlinks, including `memory/` — same as native LS/Glob/Grep.
|
|
232
|
+
Exact-path `read` / `stat` still follow.
|
|
233
|
+
|
|
234
|
+
Authored `root` skips session-directory materialize, git init,
|
|
235
|
+
and host-cwd checks. First turns prepend `buildAgentsMdContent`
|
|
236
|
+
and print `Workspace Path: /`. Host-default agents keep today's
|
|
237
|
+
materialize path.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Allowlist
|
|
242
|
+
|
|
243
|
+
| `root` | `tools` | Model-facing harness |
|
|
244
|
+
| --- | --- | --- |
|
|
245
|
+
| omitted | omitted | The seven host-disk file tools (no synthesized `SemanticSearch`). Host shell / webSearch / sandbox / native `semSearch` stay. Host file natives are hidden with `disallowedTools: ["read","ls","grep","glob","edit","delete"]`. |
|
|
246
|
+
| omitted | `["read", "shell"]` | Synthesized `Read` + SDK `shell` + `mcp`. |
|
|
247
|
+
| omitted | `[]` | No synthesized file tools. |
|
|
248
|
+
| set | omitted | All eight synthesized file tools (including `SemanticSearch`) + webSearch + webFetch + updateTodos + readTodos + `mcp`. Bind `/tmp` scratch. Not the host-default full catalog (no shell / sandbox / task / native semSearch). |
|
|
249
|
+
| set | `["updateTodos"]` | All eight synthesized file tools + `updateTodos` + `mcp`. |
|
|
250
|
+
| set | `["semSearch"]` | Synthesized `SemanticSearch` + `mcp`. Native host index stays off. |
|
|
251
|
+
| set | `[]` | No synthesized file tools. Legal and empty. |
|
|
252
|
+
| set | `["shell"]` / `["task"]` / `["readLints"]` | Fail closed. |
|
|
253
|
+
| set | `["webSearch"]` / `["webFetch"]` | All eight synthesized file tools + the listed web tool + `mcp`. Bind `/tmp` scratch. |
|
|
254
|
+
|
|
255
|
+
`mcp` is granted when any tools ride that path. File-family
|
|
256
|
+
allowlist names are omitted from the SDK allowlist; the
|
|
257
|
+
synthesized tools replace them.
|
|
258
|
+
|
|
259
|
+
`local.sandbox` is Cursor's process sandbox around child
|
|
260
|
+
processes on the host-default path. It is not a FileSystem.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Fail closed
|
|
265
|
+
|
|
266
|
+
| Combination | Result |
|
|
267
|
+
| --- | --- |
|
|
268
|
+
| `root` + `local.cwd` / `workspaceDir` / `sandbox` | Fail closed |
|
|
269
|
+
| `root` + `runtime: "cloud"` or `"grokbot"` | Fail closed |
|
|
270
|
+
| `root` + `tools` containing `"shell"` | Fail closed |
|
|
271
|
+
| `root` + `tools` containing `"task"` | Fail closed. A child keeps the host toolset. Sharing `root` needs a Cursor SDK inherit, not an overridden Task. |
|
|
272
|
+
| `root` + `tools` containing `"readLints"` | Fail closed. Diagnostics are not a FileSystem verb. |
|
|
273
|
+
| `agent/tools/Read.ts` (etc.) | Fail closed on host-default and authored `root`. |
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## `/tmp` scratch for webSearch and webFetch
|
|
278
|
+
|
|
279
|
+
Native `WebSearch` and `WebFetch` stay native. They still scratch
|
|
280
|
+
large output to `{harnessCwd}/agent-tools/{uuid}.txt` on the host
|
|
281
|
+
disk. Under `root`, the turn composes
|
|
282
|
+
`unionFs({ "/": authored, "/tmp": tempFs() })`, copies only the file
|
|
283
|
+
the native tool wrote this turn, and drops that composed root at
|
|
284
|
+
end of turn.
|
|
285
|
+
|
|
286
|
+
### Why `/tmp`
|
|
287
|
+
|
|
288
|
+
The FileSystem is the model's disk. Host `{cwd}/agent-tools/` is a
|
|
289
|
+
harness path. Under `root`, the model never sees it.
|
|
290
|
+
|
|
291
|
+
`/tmp` is the reserved scratch prefix. An authored `/tmp` is
|
|
292
|
+
shadowed. Do not put durable files there. `{cwd}/agent-tools/` and
|
|
293
|
+
`/tmp` are different namespaces.
|
|
294
|
+
|
|
295
|
+
`/agent-tools` is not reserved. Prefix `/agent` does not cover
|
|
296
|
+
`/agent-tools`. Those notes are path-prefix tests, not a mount.
|
|
297
|
+
|
|
298
|
+
Process or VM death also loses `/tmp`. Same as POSIX `/tmp`. That
|
|
299
|
+
is acceptable. Do not persist scratch across turns or process
|
|
300
|
+
restarts.
|
|
301
|
+
|
|
302
|
+
### Overlay
|
|
303
|
+
|
|
304
|
+
| Piece | Rule |
|
|
305
|
+
| --- | --- |
|
|
306
|
+
| Native tool | Still searches and fetches. |
|
|
307
|
+
| Bind | Per turn: `unionFs({ "/": authored, "/tmp": tempFs() })`. `/tmp` is a mount, not a FileSystem type. |
|
|
308
|
+
| Session cache | Authored handle may stay cached. The composed root does not. |
|
|
309
|
+
| Drop | End of turn. Next turn gets a new empty `/tmp`. |
|
|
310
|
+
| Small results | Stay inline. No disk, no rewrite. |
|
|
311
|
+
| Copy | Only a file the native tool wrote this turn under `{cwd}/agent-tools/`. |
|
|
312
|
+
| Dest | `/tmp/{uuid}.txt`. Same uuid as the host file. |
|
|
313
|
+
| Host file | Delete after copy. |
|
|
314
|
+
| Other paths | Ignore. Do not copy from the result text at large. |
|
|
315
|
+
|
|
316
|
+
Do not put that composed root on the session handle. A later turn
|
|
317
|
+
must not read another turn's `/tmp`.
|
|
318
|
+
|
|
319
|
+
### Result rewrite
|
|
320
|
+
|
|
321
|
+
Keep the native tool descriptions. They do not mention spill.
|
|
322
|
+
|
|
323
|
+
This package does not change the Cursor SDK. Native WebSearch /
|
|
324
|
+
WebFetch results land in the AgentService conversation inside
|
|
325
|
+
the local executor. That transcript is not rewritten here.
|
|
326
|
+
|
|
327
|
+
What this package rewrites:
|
|
328
|
+
|
|
329
|
+
| Surface | Overlay (`root` set) |
|
|
330
|
+
| --- | --- |
|
|
331
|
+
| `webSearch` / `webFetch` result | Host path and follow-up, in strings or structured fields (`output_location`). Other tools are untouched. |
|
|
332
|
+
| Synthesized Read / Grep input | `{cwd}/agent-tools/{uuid}.txt` → `/tmp/{uuid}.txt` |
|
|
333
|
+
|
|
334
|
+
| Field | Host path (`root` unset) | Overlay (`root` set) |
|
|
335
|
+
| --- | --- | --- |
|
|
336
|
+
| Path | `{cwd}/agent-tools/{uuid}.txt` | `/tmp/{uuid}.txt` |
|
|
337
|
+
| Follow-up | Native text (today: shell / grep / `read_file`) | Read / Grep |
|
|
338
|
+
|
|
339
|
+
Two modes, two paths. Do not invent a third.
|
|
340
|
+
|
|
341
|
+
WebFetch proto has `output_location`. WebSearch only embeds the
|
|
342
|
+
path in the chunk string. Rewrite whichever form the native tool
|
|
343
|
+
used.
|
|
344
|
+
|
|
345
|
+
The model follow path is Read / Grep on `/tmp/{uuid}.txt`,
|
|
346
|
+
including when the model still holds the host path.
|
|
347
|
+
|
|
348
|
+
### Out of scope here
|
|
349
|
+
|
|
350
|
+
MCP `spillLargeMcpTextOutput` uses the same host `agent-tools`
|
|
351
|
+
directory. The same overlay can cover it later. This section is
|
|
352
|
+
webSearch and webFetch only.
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Live `root`
|
|
357
|
+
|
|
358
|
+
When the tree depends on the conversation, pass a factory. The
|
|
359
|
+
factory returns a handle. Agent SDK may reuse the object for the
|
|
360
|
+
session. Reuse is not a snapshot of mount contents.
|
|
361
|
+
|
|
362
|
+
```ts
|
|
363
|
+
export default defineAgent({
|
|
364
|
+
name: "notes",
|
|
365
|
+
root: (ctx) => notesForSession(ctx.sessionId),
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
interface RootContext {
|
|
371
|
+
sessionId: string;
|
|
372
|
+
agentName?: string;
|
|
373
|
+
continuationKey?: string;
|
|
374
|
+
host?: { files: HostFilesApi; reminders?: ReminderHostApi };
|
|
375
|
+
}
|
|
376
|
+
```
|
package/docs/guides/github.md
CHANGED
|
@@ -260,6 +260,11 @@ behavior. Reactions still default on; set `reactions: false` when the
|
|
|
260
260
|
eyes emoji is noise. Descriptions are optional; defaults derive from
|
|
261
261
|
`botName` or the check `context`.
|
|
262
262
|
|
|
263
|
+
To match dashboard automations, set `detailsUrl(sessionId)`,
|
|
264
|
+
`summaryLinkText: "View agent"`, and `outputTitle: "context"` so the
|
|
265
|
+
check title is the check name, the summary includes `[View agent](…)`,
|
|
266
|
+
and Details opens the session.
|
|
267
|
+
|
|
263
268
|
A comment-only first wake has no head SHA, so the check waits for a
|
|
264
269
|
PR or CI event. The banner still posts. A later turn on the same SHA
|
|
265
270
|
creates a new check run; GitHub cannot reopen a completed run.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Cursor Grok Bot agents"
|
|
3
|
+
description: "Let an agent-sdk agent talk to your Grok Bot agents: mount the extension, name the bots it may reach, and decide what needs approval."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cursor Grok Bot agents
|
|
7
|
+
|
|
8
|
+
The `cursor-grokbot-agents` extension lets an agent send a message to
|
|
9
|
+
one of your Grok Bot agents and read the reply. The Grok Bot keeps its
|
|
10
|
+
own conversation, memory, and tools. Your agent stays where it is and
|
|
11
|
+
consults that bot the way you would in the Grok Bot app.
|
|
12
|
+
|
|
13
|
+
This is different from moving this agent's turns onto a hosted Grok Bot.
|
|
14
|
+
The extension keeps the agent where it is and lets it talk to *other*
|
|
15
|
+
Grok Bot agents.
|
|
16
|
+
|
|
17
|
+
## Mount it
|
|
18
|
+
|
|
19
|
+
The extension ships with `@cursor/july`. Mount it with one file.
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
// agent/extensions/grokbot.ts
|
|
23
|
+
import cursorGrokBotAgents from "@cursor/july/extensions/cursor-grokbot-agents";
|
|
24
|
+
|
|
25
|
+
export default cursorGrokBotAgents({
|
|
26
|
+
agents: [
|
|
27
|
+
{ name: "Plan Keeper", description: "Keeps or moves outdoor plans." },
|
|
28
|
+
{ name: "Chief of Staff", description: "Routes work and tracks priorities." },
|
|
29
|
+
],
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`agents` is the allowlist. List every Grok Bot the model may talk to;
|
|
34
|
+
a name outside the list is refused. Calls run under the host's
|
|
35
|
+
signed-in account (`agent-sdk login` or `CURSOR_API_KEY`). Keep
|
|
36
|
+
approval on when you can't.
|
|
37
|
+
|
|
38
|
+
Start from the [Grok Bot agents template](../templates/grokbot-agents.md)
|
|
39
|
+
when you want a project that already mounts this.
|
|
40
|
+
|
|
41
|
+
## What the agent can do
|
|
42
|
+
|
|
43
|
+
With the extension mounted, the agent can consult a Grok Bot and stay
|
|
44
|
+
in its own conversation:
|
|
45
|
+
|
|
46
|
+
- **Ask.** Send a self-contained message to a Grok Bot by the name
|
|
47
|
+
shown in the Grok Bot app. The message lands in your conversation
|
|
48
|
+
with that bot. The tool waits for the bot's reply.
|
|
49
|
+
- **Keep waiting.** A long turn returns `status: "running"`. Call check
|
|
50
|
+
with the same name to read what arrived since the last look.
|
|
51
|
+
- **Stop a turn.** Interrupt the bot's current work. The conversation
|
|
52
|
+
stays; a later ask continues it.
|
|
53
|
+
- **See who you can talk to.** List the configured bots and the ones
|
|
54
|
+
this caller has already asked. Add a name to `agents` when you want
|
|
55
|
+
the model to reach another bot.
|
|
56
|
+
|
|
57
|
+
A skill teaches the model when to bring a Grok Bot in, how to write a
|
|
58
|
+
message the bot can act on alone, and how to wait or interrupt. The
|
|
59
|
+
reply is what the Grok Bot sent to the person. If a turn finishes with
|
|
60
|
+
no reply, the bot sent nothing; ask again with a clearer request, or
|
|
61
|
+
open the bot in the Grok Bot app.
|
|
62
|
+
|
|
63
|
+
The tools reach Grok Bot agents on the signed-in account. A bot another
|
|
64
|
+
user owns is out of reach. That separation is only as fine as your
|
|
65
|
+
host's auth; a shared bearer token or `--allow-anonymous` makes every
|
|
66
|
+
caller one principal, so use
|
|
67
|
+
[authored auth](../reference/channels.md#auth-policies) when callers
|
|
68
|
+
need their own.
|
|
69
|
+
|
|
70
|
+
## Configure it
|
|
71
|
+
|
|
72
|
+
| Option | What it controls |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| `agents` | The Grok Bot agents the model may talk to, by the name shown in the app. A lone entry is the default when a call names none. Omit `agents` to allow any name; an unknown name creates an empty Grok Bot on the account. |
|
|
75
|
+
| `needsApproval` | Park asks for a [human decision](./human-in-the-loop.md). Defaults to `true` when no `agents` are configured, `false` otherwise. |
|
|
76
|
+
| `apiKey` | A Cursor API key to call with instead of the host's own. |
|
|
77
|
+
|
|
78
|
+
## Adjust it
|
|
79
|
+
|
|
80
|
+
To take a capability away, such as interrupting a turn, mount as a
|
|
81
|
+
directory and disable that tool; see
|
|
82
|
+
[overlays](../reference/extensions.md#adjust-a-mounted-extension).
|
|
83
|
+
|
|
84
|
+
## What's next
|
|
85
|
+
|
|
86
|
+
Continue with these pages:
|
|
87
|
+
|
|
88
|
+
- [Grok Bot agents template](../templates/grokbot-agents.md): scaffold
|
|
89
|
+
an agent that already mounts this
|
|
90
|
+
- [Extensions](../reference/extensions.md): how mounts, namespaces, and
|
|
91
|
+
overrides work
|
|
92
|
+
- [Human-in-the-loop approvals](./human-in-the-loop.md): where parked
|
|
93
|
+
asks get approved
|
|
@@ -237,6 +237,26 @@ rather than dropping events. An empty `deploySourceUris` list mounts
|
|
|
237
237
|
the channel but starts no pull, so an env-configured agent stays inert
|
|
238
238
|
until its deploy sources are set.
|
|
239
239
|
|
|
240
|
+
**Change Monitors** (`@cursor/july/channels/change-monitors`): Change
|
|
241
|
+
Monitor Checkpoint events. The channel publishes Factory
|
|
242
|
+
`checkpoint.created` for every Checkpoint create. The agent filters the
|
|
243
|
+
result (for example to the `issues` arm). The payload contains the
|
|
244
|
+
full Checkpoint resource. This channel is scoped to Change Monitors,
|
|
245
|
+
not generic Factory Checkpoints. There is no repository filter or
|
|
246
|
+
resource filter. Author `agent/channels/change-monitors.ts` with
|
|
247
|
+
`changeMonitorsChannel()`. It uses the host credential. The v1 omitted
|
|
248
|
+
continuation is `none/v1`. A v2 agent defaults to
|
|
249
|
+
`change_monitors.checkpoint/v2`, which keys the session as
|
|
250
|
+
`cont:change_monitors:{checkpointName}`.
|
|
251
|
+
|
|
252
|
+
**Issues** (`@cursor/july/channels/issues`): Factory issue events.
|
|
253
|
+
The channel publishes `issue.created` for every Issue create. The
|
|
254
|
+
agent filters if it needs a subset. The payload contains the full
|
|
255
|
+
Issue resource. There is no repository filter or resource filter.
|
|
256
|
+
Author `agent/channels/issues.ts` with `issuesChannel()`. It uses the
|
|
257
|
+
host credential. The v1 omitted continuation is `none/v1`. A v2 agent
|
|
258
|
+
defaults to `issues.issue/v2`, which keys the session by issue name.
|
|
259
|
+
|
|
240
260
|
For other platforms like Discord or Teams, use the authored
|
|
241
261
|
`defineChannel` webhook form.
|
|
242
262
|
|
package/docs/reference/cli.md
CHANGED
|
@@ -414,6 +414,7 @@ non-zero when the reconstructed trajectory failed.
|
|
|
414
414
|
```bash
|
|
415
415
|
agent-sdk init ./my-agent # scaffold package.json, tsconfig.json, agent/ + a demo tool
|
|
416
416
|
agent-sdk init ./my-demo --template demo # record a PR walkthrough
|
|
417
|
+
agent-sdk init ./grokbot --template grokbot-agents # talk to Grok Bot agents
|
|
417
418
|
agent-sdk init ./code-wiki --template code-wiki # keep wiki pages current after merge
|
|
418
419
|
agent-sdk init ./agents-md --template agents-md # keep AGENTS.md current from last week's PRs and Slack
|
|
419
420
|
agent-sdk init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
@@ -435,7 +436,7 @@ agent-sdk init # no directory: print the setup guide
|
|
|
435
436
|
Templates may ship `init.json`. On a TTY, `init` asks those questions
|
|
436
437
|
before writing files. `code-wiki`, `pr-autofixer`, `security-help`, and
|
|
437
438
|
`agents-md` ask for GitHub repos. `agents-md` also asks for Slack
|
|
438
|
-
channels. Repeat
|
|
439
|
+
channels. `grokbot-agents` asks for Grok Bot names. Repeat
|
|
439
440
|
`--var id=value` to answer without a prompt.
|
|
440
441
|
`--json` and non-TTY hosts skip the interview unless `--var` is set.
|
|
441
442
|
|
|
@@ -263,6 +263,8 @@ Continue with these pages:
|
|
|
263
263
|
|
|
264
264
|
- [Cursor cloud agents](../guides/cloud-agents.md): the extension that
|
|
265
265
|
lets an agent launch and steer cloud agents
|
|
266
|
+
- [Cursor Grok Bot agents](../guides/grokbot-agents.md): the extension
|
|
267
|
+
that lets an agent talk to Grok Bot agents
|
|
266
268
|
- [Tools](./tools.md): the tool contract extensions contribute to
|
|
267
269
|
- [Skills](./skills.md): the skill forms an extension can carry
|
|
268
270
|
- [Project layout](./project-layout.md): where `agent/extensions/` sits
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Talk to your Grok Bot agents"
|
|
3
|
+
description: "Scaffold the agent, name the Grok Bot agents it may reach, and consult them from its own conversation."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Talk to your Grok Bot agents
|
|
7
|
+
|
|
8
|
+
This agent sends a message to a Grok Bot you already use and reads the
|
|
9
|
+
reply. The Grok Bot keeps its conversation. This agent stays where it
|
|
10
|
+
is.
|
|
11
|
+
|
|
12
|
+
## Scaffold
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @cursor/july init ./grokbot --template grokbot-agents
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`init` asks for the names shown in the Grok Bot app. Every name is an
|
|
19
|
+
allowlist entry. Pass `--var agents="Plan Keeper, Chief of Staff"` to
|
|
20
|
+
skip the prompt.
|
|
21
|
+
|
|
22
|
+
The names land in `agent/extensions/grokbot.ts`. A name outside that
|
|
23
|
+
list is refused.
|
|
24
|
+
|
|
25
|
+
## Log in
|
|
26
|
+
|
|
27
|
+
Asks run under the signed-in account.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
cd grokbot
|
|
31
|
+
agent-sdk login
|
|
32
|
+
agent-sdk dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
In the playground, ask it to talk to one of the names you entered.
|
|
36
|
+
|
|
37
|
+
## What to edit
|
|
38
|
+
|
|
39
|
+
- `agent/extensions/grokbot.ts`: who it may talk to. Add `needsApproval: true` to park each ask.
|
|
40
|
+
- `agent/instructions.md`: when to consult them
|
|
41
|
+
|
|
42
|
+
See [Cursor Grok Bot agents](../guides/grokbot-agents.md) for the
|
|
43
|
+
extension, and [Human-in-the-loop approvals](../guides/human-in-the-loop.md)
|
|
44
|
+
for where a parked ask gets approved.
|
|
45
|
+
|
|
46
|
+
## Evals
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
agent-sdk eval
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The smoke case asks who it can talk to. It must list the configured
|
|
53
|
+
bots and not send a message.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cursor/july",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.105",
|
|
4
4
|
"description": "(early alpha) Filesystem-first framework for defining Cursor agents as markdown and TypeScript and serving them over channels with the Cursor SDK.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"repository": {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"!dist/playground-central/**",
|
|
24
24
|
"!dist/internal/tenant-mcp/**",
|
|
25
25
|
"!dist/internal/grokbot/**",
|
|
26
|
+
"!dist/extensions/cursor-grokbot-agents/**",
|
|
26
27
|
"!dist/internal/review-comments.*",
|
|
27
28
|
"!dist/internal/shallow-clone.*",
|
|
28
29
|
"!dist/internal/managed-delivery.*",
|
|
@@ -30,6 +31,7 @@
|
|
|
30
31
|
"!src/**/*.test.ts",
|
|
31
32
|
"!src/internal/tenant-mcp/**",
|
|
32
33
|
"!src/internal/grokbot/**",
|
|
34
|
+
"!src/extensions/cursor-grokbot-agents/**",
|
|
33
35
|
"!src/internal/review-comments.ts",
|
|
34
36
|
"!src/internal/shallow-clone.ts",
|
|
35
37
|
"!src/internal/managed-delivery.ts",
|
|
@@ -105,6 +107,18 @@
|
|
|
105
107
|
"import": "./dist/channels/deployments/index.js",
|
|
106
108
|
"default": "./dist/channels/deployments/index.js"
|
|
107
109
|
},
|
|
110
|
+
"./channels/change-monitors": {
|
|
111
|
+
"anysphere-source": "./src/channels/change-monitors/index.ts",
|
|
112
|
+
"types": "./dist/channels/change-monitors/index.d.ts",
|
|
113
|
+
"import": "./dist/channels/change-monitors/index.js",
|
|
114
|
+
"default": "./dist/channels/change-monitors/index.js"
|
|
115
|
+
},
|
|
116
|
+
"./channels/issues": {
|
|
117
|
+
"anysphere-source": "./src/channels/issues/index.ts",
|
|
118
|
+
"types": "./dist/channels/issues/index.d.ts",
|
|
119
|
+
"import": "./dist/channels/issues/index.js",
|
|
120
|
+
"default": "./dist/channels/issues/index.js"
|
|
121
|
+
},
|
|
108
122
|
"./skills": {
|
|
109
123
|
"anysphere-source": "./src/skills.ts",
|
|
110
124
|
"types": "./dist/skills.d.ts",
|
|
@@ -125,6 +139,13 @@
|
|
|
125
139
|
"import": "./dist/extensions/cursor-cloud-agents/extension.js",
|
|
126
140
|
"default": "./dist/extensions/cursor-cloud-agents/extension.js"
|
|
127
141
|
},
|
|
142
|
+
"./extensions/cursor-grokbot-agents": {
|
|
143
|
+
"anysphere-source": "./src/extensions/cursor-grokbot-agents/extension.ts",
|
|
144
|
+
"bun": "./dist/extensions/cursor-grokbot-agents/extension.js",
|
|
145
|
+
"types": "./dist/extensions/cursor-grokbot-agents/extension.d.ts",
|
|
146
|
+
"import": "./dist/extensions/cursor-grokbot-agents/extension.js",
|
|
147
|
+
"default": "./dist/extensions/cursor-grokbot-agents/extension.js"
|
|
148
|
+
},
|
|
128
149
|
"./schedules": {
|
|
129
150
|
"anysphere-source": "./src/schedules.ts",
|
|
130
151
|
"types": "./dist/schedules.d.ts",
|
|
@@ -302,6 +323,7 @@
|
|
|
302
323
|
"esbuild": "^0.25.0",
|
|
303
324
|
"javascript-time-ago": "^2.6.4",
|
|
304
325
|
"js-yaml": "4.1.0",
|
|
326
|
+
"minimatch": "^10.2.5",
|
|
305
327
|
"ms": "^2.1.3",
|
|
306
328
|
"proper-lockfile": "^4.1.2",
|
|
307
329
|
"slackify-markdown": "^5.0.0",
|
|
@@ -317,12 +339,13 @@
|
|
|
317
339
|
"@types/js-yaml": "4.0.9",
|
|
318
340
|
"@types/ms": "^2.1.0",
|
|
319
341
|
"@types/node": "catalog:",
|
|
342
|
+
"@types/pg": "^8.16.0",
|
|
320
343
|
"@types/proper-lockfile": "^4.1.4",
|
|
321
344
|
"@types/react": "^19.0.0",
|
|
322
345
|
"@types/react-dom": "^19.0.0",
|
|
323
346
|
"@typescript/native-preview": "7.0.0-dev.20260701.1",
|
|
324
347
|
"@vitejs/plugin-react": "^5.1.2",
|
|
325
|
-
"
|
|
348
|
+
"pg": "^8.18.0",
|
|
326
349
|
"pretty-ms": "^9.2.0",
|
|
327
350
|
"react": "^19.2.1",
|
|
328
351
|
"react-dom": "^19.2.1",
|