@sargonpiraev/pulumi-cursor 0.0.0-stage → 0.0.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/LICENSE +21 -0
- package/README.md +53 -2
- package/bin/pulumi-resource-cursor.js +2 -0
- package/build/__tests__/api.test.d.ts +2 -0
- package/build/__tests__/api.test.d.ts.map +1 -0
- package/build/__tests__/api.test.js +28 -0
- package/build/__tests__/api.test.js.map +1 -0
- package/build/api.d.ts +44 -0
- package/build/api.d.ts.map +1 -0
- package/build/api.js +31 -0
- package/build/api.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +3 -0
- package/build/index.js.map +1 -0
- package/build/resource.d.ts +26 -0
- package/build/resource.d.ts.map +1 -0
- package/build/resource.js +34 -0
- package/build/resource.js.map +1 -0
- package/build/server.d.ts +2 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +211 -0
- package/build/server.js.map +1 -0
- package/package.json +57 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Sargon Piraev
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,54 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @sargonpiraev/pulumi-cursor
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Pulumi provider for [Cursor Cloud Agents](https://cursor.com/docs/cloud-agent/api/endpoints.md) **v1**: a durable **Agent** plus ephemeral **runs** (not modeled as Pulumi resources).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sargonpiraev/pulumi-cursor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Pulumi looks up `pulumi-resource-cursor` on `PATH` after install:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
export PATH="$(npm root)/.bin:$PATH"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { Provider, Agent } from '@sargonpiraev/pulumi-cursor'
|
|
21
|
+
|
|
22
|
+
const cursor = new Provider('cursor', {
|
|
23
|
+
apiKey: process.env.CURSOR_API_KEY!,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const growth = new Agent(
|
|
27
|
+
'growth',
|
|
28
|
+
{
|
|
29
|
+
apiKey: process.env.CURSOR_API_KEY!,
|
|
30
|
+
name: 'growth',
|
|
31
|
+
promptText: '...',
|
|
32
|
+
repositoryUrl: 'https://github.com/sargonpiraev/anidex',
|
|
33
|
+
startingRef: 'main',
|
|
34
|
+
autoCreatePR: true,
|
|
35
|
+
mcpServers: [
|
|
36
|
+
{
|
|
37
|
+
name: 'bigquery',
|
|
38
|
+
type: 'stdio',
|
|
39
|
+
command: 'npx',
|
|
40
|
+
args: ['-y', '@toolbox-sdk/server@latest', '--prebuilt', 'bigquery', '--stdio'],
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{ provider: cursor }
|
|
45
|
+
)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Create is `POST /v1/agents` (agent + initial run). Follow-ups are `POST /v1/agents/{id}/runs` from a scheduler — not a Pulumi resource.
|
|
49
|
+
|
|
50
|
+
Auth: Cursor Dashboard API key as `Authorization: Bearer` (`CURSOR_API_KEY`).
|
|
51
|
+
|
|
52
|
+
## Home
|
|
53
|
+
|
|
54
|
+
https://github.com/sargonpiraev/shared/tree/main/packages/pulumi-cursor
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { buildCreateAgentBody, buildCreateRunBody } from '../api';
|
|
2
|
+
describe('Cursor Cloud Agents request bodies', () => {
|
|
3
|
+
it('builds POST /v1/agents with repos, autoCreatePR, and mcpServers', () => {
|
|
4
|
+
const body = buildCreateAgentBody({
|
|
5
|
+
name: 'growth',
|
|
6
|
+
promptText: 'Follow .agents/growth.md',
|
|
7
|
+
repositoryUrl: 'https://github.com/sargonpiraev/anidex',
|
|
8
|
+
startingRef: 'main',
|
|
9
|
+
autoCreatePR: true,
|
|
10
|
+
skipReviewerRequest: false,
|
|
11
|
+
mcpServers: [{ name: 'bigquery', type: 'stdio', command: 'npx' }],
|
|
12
|
+
});
|
|
13
|
+
expect(body).toEqual({
|
|
14
|
+
name: 'growth',
|
|
15
|
+
prompt: { text: 'Follow .agents/growth.md' },
|
|
16
|
+
repos: [{ url: 'https://github.com/sargonpiraev/anidex', startingRef: 'main' }],
|
|
17
|
+
autoCreatePR: true,
|
|
18
|
+
skipReviewerRequest: false,
|
|
19
|
+
mcpServers: [{ name: 'bigquery', type: 'stdio', command: 'npx' }],
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it('builds POST /v1/agents/{id}/runs follow-up prompt', () => {
|
|
23
|
+
expect(buildCreateRunBody({ promptText: 'snapshot' })).toEqual({
|
|
24
|
+
prompt: { text: 'snapshot' },
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAA;AAEjE,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,oBAAoB,CAAC;YAChC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,0BAA0B;YACtC,aAAa,EAAE,wCAAwC;YACvD,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAClE,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;YAC5C,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,wCAAwC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YAC/E,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAClE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;SAC7B,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/build/api.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const CURSOR_API = "https://api.cursor.com";
|
|
2
|
+
export type CursorMcpServer = {
|
|
3
|
+
name: string;
|
|
4
|
+
type?: 'stdio' | 'http' | 'sse';
|
|
5
|
+
command?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
url?: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
export type CreateAgentBody = {
|
|
12
|
+
name: string;
|
|
13
|
+
prompt: {
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
repos: Array<{
|
|
17
|
+
url: string;
|
|
18
|
+
startingRef: string;
|
|
19
|
+
}>;
|
|
20
|
+
autoCreatePR: boolean;
|
|
21
|
+
skipReviewerRequest: boolean;
|
|
22
|
+
mcpServers: CursorMcpServer[];
|
|
23
|
+
};
|
|
24
|
+
export declare function buildCreateAgentBody(input: {
|
|
25
|
+
name: string;
|
|
26
|
+
promptText: string;
|
|
27
|
+
repositoryUrl: string;
|
|
28
|
+
startingRef: string;
|
|
29
|
+
autoCreatePR: boolean;
|
|
30
|
+
skipReviewerRequest: boolean;
|
|
31
|
+
mcpServers: CursorMcpServer[];
|
|
32
|
+
}): CreateAgentBody;
|
|
33
|
+
export declare function buildCreateRunBody(input: {
|
|
34
|
+
promptText: string;
|
|
35
|
+
}): {
|
|
36
|
+
prompt: {
|
|
37
|
+
text: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export declare function cursorFetch(apiKey: string, method: string, path: string, body?: unknown): Promise<{
|
|
41
|
+
status: number;
|
|
42
|
+
json: unknown;
|
|
43
|
+
}>;
|
|
44
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,2BAA2B,CAAA;AAElD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACxB,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClD,YAAY,EAAE,OAAO,CAAA;IACrB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B,CAAA;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B,GAAG,eAAe,CASlB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAE9F;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAc5C"}
|
package/build/api.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const CURSOR_API = 'https://api.cursor.com';
|
|
2
|
+
export function buildCreateAgentBody(input) {
|
|
3
|
+
return {
|
|
4
|
+
name: input.name,
|
|
5
|
+
prompt: { text: input.promptText },
|
|
6
|
+
repos: [{ url: input.repositoryUrl, startingRef: input.startingRef }],
|
|
7
|
+
autoCreatePR: input.autoCreatePR,
|
|
8
|
+
skipReviewerRequest: input.skipReviewerRequest,
|
|
9
|
+
mcpServers: input.mcpServers,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function buildCreateRunBody(input) {
|
|
13
|
+
return { prompt: { text: input.promptText } };
|
|
14
|
+
}
|
|
15
|
+
export async function cursorFetch(apiKey, method, path, body) {
|
|
16
|
+
const res = await fetch(`${CURSOR_API}${path}`, {
|
|
17
|
+
method,
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${apiKey}`,
|
|
20
|
+
Accept: 'application/json',
|
|
21
|
+
...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
22
|
+
},
|
|
23
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
24
|
+
});
|
|
25
|
+
const text = await res.text();
|
|
26
|
+
if (text.length === 0)
|
|
27
|
+
return { status: res.status, json: {} };
|
|
28
|
+
const json = JSON.parse(text);
|
|
29
|
+
return { status: res.status, json };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=api.js.map
|
package/build/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAA;AAqBlD,MAAM,UAAU,oBAAoB,CAAC,KAQpC;IACC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;QAClC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QACrE,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAA;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,IAAI,EAAE,EAAE;QAC9C,MAAM;QACN,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE;QACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAA;IACxC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;AACrC,CAAC"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,UAAU,CAAA"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,GAEX,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
import type { CursorMcpServer } from './api.js';
|
|
3
|
+
export declare class Provider extends pulumi.ProviderResource {
|
|
4
|
+
constructor(name: string, args: {
|
|
5
|
+
apiKey: pulumi.Input<string>;
|
|
6
|
+
}, opts?: pulumi.ResourceOptions);
|
|
7
|
+
}
|
|
8
|
+
export declare class Agent extends pulumi.CustomResource {
|
|
9
|
+
readonly agentId: pulumi.Output<string>;
|
|
10
|
+
readonly agentName: pulumi.Output<string>;
|
|
11
|
+
readonly status: pulumi.Output<string>;
|
|
12
|
+
readonly url: pulumi.Output<string>;
|
|
13
|
+
readonly createdAt: pulumi.Output<string>;
|
|
14
|
+
readonly updatedAt: pulumi.Output<string>;
|
|
15
|
+
constructor(name: string, args: {
|
|
16
|
+
apiKey: pulumi.Input<string>;
|
|
17
|
+
name: pulumi.Input<string>;
|
|
18
|
+
promptText: pulumi.Input<string>;
|
|
19
|
+
repositoryUrl: pulumi.Input<string>;
|
|
20
|
+
startingRef: pulumi.Input<string>;
|
|
21
|
+
autoCreatePR: pulumi.Input<boolean>;
|
|
22
|
+
skipReviewerRequest?: pulumi.Input<boolean>;
|
|
23
|
+
mcpServers: pulumi.Input<CursorMcpServer[]>;
|
|
24
|
+
}, opts?: pulumi.CustomResourceOptions);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,qBAAa,QAAS,SAAQ,MAAM,CAAC,gBAAgB;gBACvC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;KAAE,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,eAAe;CAGhG;AAED,qBAAa,KAAM,SAAQ,MAAM,CAAC,cAAc;IAC9C,SAAgB,OAAO,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/C,SAAgB,SAAS,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjD,SAAgB,MAAM,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC9C,SAAgB,GAAG,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3C,SAAgB,SAAS,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjD,SAAgB,SAAS,EAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAG/C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC5B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC1B,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAChC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACnC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAA;KAC5C,EACD,IAAI,CAAC,EAAE,MAAM,CAAC,qBAAqB;CA4BtC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
+
export class Provider extends pulumi.ProviderResource {
|
|
3
|
+
constructor(name, args, opts) {
|
|
4
|
+
super('cursor', name, { apiKey: pulumi.secret(args.apiKey) }, opts);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class Agent extends pulumi.CustomResource {
|
|
8
|
+
agentId;
|
|
9
|
+
agentName;
|
|
10
|
+
status;
|
|
11
|
+
url;
|
|
12
|
+
createdAt;
|
|
13
|
+
updatedAt;
|
|
14
|
+
constructor(name, args, opts) {
|
|
15
|
+
const mcpServersJson = pulumi.secret(pulumi.output(args.mcpServers).apply((servers) => JSON.stringify(servers)));
|
|
16
|
+
super('cursor:index:Agent', name, {
|
|
17
|
+
apiKey: pulumi.secret(args.apiKey),
|
|
18
|
+
name: args.name,
|
|
19
|
+
promptText: args.promptText,
|
|
20
|
+
repositoryUrl: args.repositoryUrl,
|
|
21
|
+
startingRef: args.startingRef,
|
|
22
|
+
autoCreatePR: args.autoCreatePR,
|
|
23
|
+
skipReviewerRequest: args.skipReviewerRequest ?? false,
|
|
24
|
+
mcpServersJson,
|
|
25
|
+
agentId: undefined,
|
|
26
|
+
agentName: undefined,
|
|
27
|
+
status: undefined,
|
|
28
|
+
url: undefined,
|
|
29
|
+
createdAt: undefined,
|
|
30
|
+
updatedAt: undefined,
|
|
31
|
+
}, opts);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAA;AAGxC,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,gBAAgB;IACnD,YAAY,IAAY,EAAE,IAAsC,EAAE,IAA6B;QAC7F,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACrE,CAAC;CACF;AAED,MAAM,OAAO,KAAM,SAAQ,MAAM,CAAC,cAAc;IAC9B,OAAO,CAAwB;IAC/B,SAAS,CAAwB;IACjC,MAAM,CAAwB;IAC9B,GAAG,CAAwB;IAC3B,SAAS,CAAwB;IACjC,SAAS,CAAwB;IAEjD,YACE,IAAY,EACZ,IASC,EACD,IAAmC;QAEnC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAC3E,CAAA;QAED,KAAK,CACH,oBAAoB,EACpB,IAAI,EACJ;YACE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,KAAK;YACtD,cAAc;YACd,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,SAAS;YACjB,GAAG,EAAE,SAAS;YACd,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;SACrB,EACD,IAAI,CACL,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|
package/build/server.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { main } from '@pulumi/pulumi/provider/server.js';
|
|
2
|
+
import { buildCreateAgentBody, cursorFetch } from './api.js';
|
|
3
|
+
const schema = JSON.stringify({
|
|
4
|
+
name: 'cursor',
|
|
5
|
+
version: '0.1.0',
|
|
6
|
+
config: {
|
|
7
|
+
variables: {
|
|
8
|
+
apiKey: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
secret: true,
|
|
11
|
+
description: 'Cursor Cloud Agents API key (Bearer). Vault: CURSOR_API_KEY.',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
required: ['apiKey'],
|
|
15
|
+
},
|
|
16
|
+
resources: {
|
|
17
|
+
'cursor:index:Agent': {
|
|
18
|
+
description: 'Durable Cursor Cloud Agent (POST /v1/agents). Runs are ephemeral — use POST /v1/agents/{id}/runs.',
|
|
19
|
+
properties: {
|
|
20
|
+
apiKey: { type: 'string', secret: true },
|
|
21
|
+
name: { type: 'string' },
|
|
22
|
+
promptText: { type: 'string' },
|
|
23
|
+
repositoryUrl: { type: 'string' },
|
|
24
|
+
startingRef: { type: 'string' },
|
|
25
|
+
autoCreatePR: { type: 'boolean' },
|
|
26
|
+
skipReviewerRequest: { type: 'boolean' },
|
|
27
|
+
mcpServersJson: { type: 'string', secret: true },
|
|
28
|
+
agentId: { type: 'string' },
|
|
29
|
+
agentName: { type: 'string' },
|
|
30
|
+
status: { type: 'string' },
|
|
31
|
+
url: { type: 'string' },
|
|
32
|
+
createdAt: { type: 'string' },
|
|
33
|
+
updatedAt: { type: 'string' },
|
|
34
|
+
},
|
|
35
|
+
required: [
|
|
36
|
+
'apiKey',
|
|
37
|
+
'name',
|
|
38
|
+
'promptText',
|
|
39
|
+
'repositoryUrl',
|
|
40
|
+
'startingRef',
|
|
41
|
+
'autoCreatePR',
|
|
42
|
+
'mcpServersJson',
|
|
43
|
+
'agentId',
|
|
44
|
+
'agentName',
|
|
45
|
+
'status',
|
|
46
|
+
'url',
|
|
47
|
+
'createdAt',
|
|
48
|
+
'updatedAt',
|
|
49
|
+
],
|
|
50
|
+
inputProperties: {
|
|
51
|
+
apiKey: { type: 'string', secret: true },
|
|
52
|
+
name: { type: 'string' },
|
|
53
|
+
promptText: { type: 'string' },
|
|
54
|
+
repositoryUrl: { type: 'string' },
|
|
55
|
+
startingRef: { type: 'string' },
|
|
56
|
+
autoCreatePR: { type: 'boolean' },
|
|
57
|
+
skipReviewerRequest: { type: 'boolean' },
|
|
58
|
+
mcpServersJson: { type: 'string', secret: true },
|
|
59
|
+
},
|
|
60
|
+
requiredInputs: [
|
|
61
|
+
'apiKey',
|
|
62
|
+
'name',
|
|
63
|
+
'promptText',
|
|
64
|
+
'repositoryUrl',
|
|
65
|
+
'startingRef',
|
|
66
|
+
'autoCreatePR',
|
|
67
|
+
'mcpServersJson',
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
function resourceType(urn) {
|
|
73
|
+
return urn.split('::')[2]?.split(':').pop() ?? '';
|
|
74
|
+
}
|
|
75
|
+
function unwrapString(value, field) {
|
|
76
|
+
if (typeof value === 'string')
|
|
77
|
+
return value;
|
|
78
|
+
if (value && typeof value === 'object') {
|
|
79
|
+
const rec = value;
|
|
80
|
+
if (typeof rec.value === 'string')
|
|
81
|
+
return rec.value;
|
|
82
|
+
if (typeof rec.plaintext === 'string')
|
|
83
|
+
return rec.plaintext;
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`${field} must be a string, got ${typeof value}`);
|
|
86
|
+
}
|
|
87
|
+
function apiKeyFrom(props) {
|
|
88
|
+
return unwrapString(props?.apiKey, 'apiKey');
|
|
89
|
+
}
|
|
90
|
+
function parseAgent(json) {
|
|
91
|
+
const root = json;
|
|
92
|
+
const agent = root.agent ?? root;
|
|
93
|
+
return {
|
|
94
|
+
id: agent.id,
|
|
95
|
+
name: agent.name,
|
|
96
|
+
status: agent.status,
|
|
97
|
+
url: agent.url,
|
|
98
|
+
createdAt: agent.createdAt,
|
|
99
|
+
updatedAt: agent.updatedAt,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function mcpServersFromInputs(inputs) {
|
|
103
|
+
const raw = inputs.mcpServersJson;
|
|
104
|
+
if (Array.isArray(raw))
|
|
105
|
+
return raw;
|
|
106
|
+
if (typeof raw === 'string')
|
|
107
|
+
return JSON.parse(raw);
|
|
108
|
+
if (raw && typeof raw === 'object' && 'value' in raw) {
|
|
109
|
+
return mcpServersFromInputs({ mcpServersJson: raw.value });
|
|
110
|
+
}
|
|
111
|
+
throw new Error(`mcpServersJson must be a JSON string or array, got ${typeof raw}`);
|
|
112
|
+
}
|
|
113
|
+
function outsFromAgent(inputs, agent) {
|
|
114
|
+
return {
|
|
115
|
+
name: inputs.name,
|
|
116
|
+
promptText: inputs.promptText,
|
|
117
|
+
repositoryUrl: inputs.repositoryUrl,
|
|
118
|
+
startingRef: inputs.startingRef,
|
|
119
|
+
autoCreatePR: inputs.autoCreatePR,
|
|
120
|
+
skipReviewerRequest: inputs.skipReviewerRequest ?? false,
|
|
121
|
+
apiKey: inputs.apiKey,
|
|
122
|
+
mcpServersJson: inputs.mcpServersJson,
|
|
123
|
+
agentId: agent.id,
|
|
124
|
+
agentName: agent.name ?? inputs.name,
|
|
125
|
+
status: agent.status,
|
|
126
|
+
url: agent.url,
|
|
127
|
+
createdAt: agent.createdAt,
|
|
128
|
+
updatedAt: agent.updatedAt,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const provider = {
|
|
132
|
+
version: '0.1.0',
|
|
133
|
+
schema,
|
|
134
|
+
async create(urn, inputs) {
|
|
135
|
+
if (resourceType(urn) !== 'Agent')
|
|
136
|
+
throw new Error(`Unknown resource type in URN: ${urn}`);
|
|
137
|
+
const key = apiKeyFrom(inputs);
|
|
138
|
+
const body = buildCreateAgentBody({
|
|
139
|
+
name: inputs.name,
|
|
140
|
+
promptText: inputs.promptText,
|
|
141
|
+
repositoryUrl: inputs.repositoryUrl,
|
|
142
|
+
startingRef: inputs.startingRef,
|
|
143
|
+
autoCreatePR: inputs.autoCreatePR,
|
|
144
|
+
skipReviewerRequest: inputs.skipReviewerRequest ?? false,
|
|
145
|
+
mcpServers: mcpServersFromInputs(inputs),
|
|
146
|
+
});
|
|
147
|
+
const { status, json } = await cursorFetch(key, 'POST', '/v1/agents', body);
|
|
148
|
+
if (status !== 201) {
|
|
149
|
+
throw new Error(`Cursor POST /v1/agents ${status}: ${JSON.stringify(json).slice(0, 800)}`);
|
|
150
|
+
}
|
|
151
|
+
const agent = parseAgent(json);
|
|
152
|
+
if (!agent.id) {
|
|
153
|
+
throw new Error(`Cursor POST /v1/agents missing agent.id: ${JSON.stringify(json).slice(0, 800)}`);
|
|
154
|
+
}
|
|
155
|
+
return { id: agent.id, outs: outsFromAgent(inputs, agent) };
|
|
156
|
+
},
|
|
157
|
+
async read(id, urn, props) {
|
|
158
|
+
if (resourceType(urn) !== 'Agent')
|
|
159
|
+
return { id };
|
|
160
|
+
const key = apiKeyFrom(props);
|
|
161
|
+
if (!key) {
|
|
162
|
+
return { id, props: props ?? {} };
|
|
163
|
+
}
|
|
164
|
+
const { status, json } = await cursorFetch(key, 'GET', `/v1/agents/${id}`);
|
|
165
|
+
if (status === 404)
|
|
166
|
+
return { id: '' };
|
|
167
|
+
if (status !== 200) {
|
|
168
|
+
throw new Error(`Cursor GET /v1/agents/${id} ${status}: ${JSON.stringify(json).slice(0, 800)}`);
|
|
169
|
+
}
|
|
170
|
+
const agent = parseAgent(json);
|
|
171
|
+
return { id, props: outsFromAgent(props ?? {}, agent) };
|
|
172
|
+
},
|
|
173
|
+
async diff(_id, urn, olds, news) {
|
|
174
|
+
if (resourceType(urn) !== 'Agent')
|
|
175
|
+
return {};
|
|
176
|
+
const replaces = [];
|
|
177
|
+
if (olds.repositoryUrl !== news.repositoryUrl)
|
|
178
|
+
replaces.push('repositoryUrl');
|
|
179
|
+
if (olds.startingRef !== news.startingRef)
|
|
180
|
+
replaces.push('startingRef');
|
|
181
|
+
const changed = replaces.length > 0 ||
|
|
182
|
+
olds.name !== news.name ||
|
|
183
|
+
olds.promptText !== news.promptText ||
|
|
184
|
+
olds.autoCreatePR !== news.autoCreatePR ||
|
|
185
|
+
olds.skipReviewerRequest !== news.skipReviewerRequest ||
|
|
186
|
+
olds.mcpServersJson !== news.mcpServersJson;
|
|
187
|
+
return { changes: changed, replaces };
|
|
188
|
+
},
|
|
189
|
+
async update(id, urn, _olds, news) {
|
|
190
|
+
if (resourceType(urn) !== 'Agent')
|
|
191
|
+
throw new Error(`Unknown resource type in URN: ${urn}`);
|
|
192
|
+
const key = apiKeyFrom(news);
|
|
193
|
+
const { status, json } = await cursorFetch(key, 'GET', `/v1/agents/${id}`);
|
|
194
|
+
if (status !== 200) {
|
|
195
|
+
throw new Error(`Cursor GET /v1/agents/${id} ${status}: ${JSON.stringify(json).slice(0, 800)}`);
|
|
196
|
+
}
|
|
197
|
+
const agent = parseAgent(json);
|
|
198
|
+
return { outs: outsFromAgent(news, agent) };
|
|
199
|
+
},
|
|
200
|
+
async delete(id, urn, props) {
|
|
201
|
+
if (resourceType(urn) !== 'Agent')
|
|
202
|
+
return;
|
|
203
|
+
const key = apiKeyFrom(props);
|
|
204
|
+
const { status, json } = await cursorFetch(key, 'DELETE', `/v1/agents/${id}`);
|
|
205
|
+
if (status !== 200 && status !== 404) {
|
|
206
|
+
throw new Error(`Cursor DELETE /v1/agents/${id} ${status}: ${JSON.stringify(json).slice(0, 800)}`);
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
main(provider, process.argv.slice(2));
|
|
211
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sargonpiraev/pulumi-cursor",
|
|
3
|
-
"version": "0.0.0
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Pulumi provider for Cursor Cloud Agents (v1 durable agent + runs)",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pulumi",
|
|
7
|
+
"provider",
|
|
8
|
+
"cursor",
|
|
9
|
+
"cloud-agents",
|
|
10
|
+
"infrastructure"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/sargonpiraev/shared/tree/main/packages/pulumi-cursor#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/sargonpiraev/shared/issues"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/sargonpiraev/shared.git",
|
|
19
|
+
"directory": "packages/pulumi-cursor"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": {
|
|
23
|
+
"name": "Sargon Piraev",
|
|
24
|
+
"email": "sargonpiraev@gmail.com"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./build/index.js",
|
|
28
|
+
"types": "./build/index.d.ts",
|
|
29
|
+
"bin": {
|
|
30
|
+
"pulumi-resource-cursor": "./bin/pulumi-resource-cursor.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"build",
|
|
34
|
+
"bin",
|
|
35
|
+
"README.md",
|
|
36
|
+
"LICENSE"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p tsconfig.json",
|
|
40
|
+
"check-types": "tsc -p tsconfig.json --noEmit",
|
|
41
|
+
"lint": "eslint ./src --ext .ts",
|
|
42
|
+
"test": "jest --passWithNoTests --coverage",
|
|
43
|
+
"test:unit": "jest --passWithNoTests --coverage"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@pulumi/pulumi": "^3.0.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^22.15.3",
|
|
50
|
+
"typescript": "5.9.2"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18.0.0"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public",
|
|
57
|
+
"provenance": true
|
|
58
|
+
}
|
|
59
|
+
}
|