@cursor/july 0.1.1 → 0.1.3
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/AGENTS.md +40 -7
- package/README.md +33 -24
- package/dist/bin/agent-serve.d.ts +3 -1
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +466 -140
- package/dist/channels/github/api.d.ts.map +1 -1
- package/dist/channels/github/api.js +31 -14
- package/dist/channels/github/cursor-account.d.ts +43 -0
- package/dist/channels/github/cursor-account.d.ts.map +1 -0
- package/dist/channels/github/cursor-account.js +95 -0
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +46 -9
- package/dist/channels/github/index.d.ts +2 -2
- package/dist/channels/github/index.js +2 -2
- package/dist/channels/github/types.d.ts +17 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.d.ts +8 -2
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +8 -0
- package/dist/channels/slack/types.d.ts +24 -3
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/types.js +15 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +8 -8
- package/dist/docs/assets/{ab.md.COdXkces.js → ab.md.BMCZ6Hd7.js} +3 -3
- package/dist/docs/assets/{ab.md.COdXkces.lean.js → ab.md.BMCZ6Hd7.lean.js} +1 -1
- package/dist/docs/assets/{app.DqfFEmJd.js → app.BR0RbIdx.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtIOQzGj.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BaLEdS15.js → VPLocalSearchBox.qjsVTneI.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CZRvu_0q.js → theme.2Kg8jIp_.js} +2 -2
- package/dist/docs/assets/{deployment.md.Dx1TYNk5.js → deployment.md.DTKwE15Z.js} +3 -3
- package/dist/docs/assets/{deployment.md.Dx1TYNk5.lean.js → deployment.md.DTKwE15Z.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.DPZ_MAnI.js → evals.md.DAgEc_hL.js} +3 -3
- package/dist/docs/assets/{guides_agent-to-agent.md.CrtrsySy.js → guides_agent-to-agent.md.Bpzgq2Pq.js} +1 -1
- package/dist/docs/assets/{guides_cloud-runtime.md.CYlNMTNp.js → guides_cloud-runtime.md.gVzabdQL.js} +1 -1
- package/dist/docs/assets/{guides_github.md.DwbKhCeS.js → guides_github.md.DOOCpqsW.js} +11 -4
- package/dist/docs/assets/{guides_github.md.DwbKhCeS.lean.js → guides_github.md.DOOCpqsW.lean.js} +1 -1
- package/dist/docs/assets/{guides_human-in-the-loop.md.Dvuctx7s.js → guides_human-in-the-loop.md.DlUqsp1S.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.bv41fHfW.js → guides_slack.md.CCwqHvSV.js} +4 -4
- package/dist/docs/assets/{guides_slack.md.bv41fHfW.lean.js → guides_slack.md.CCwqHvSV.lean.js} +1 -1
- package/dist/docs/assets/{guides_webhooks.md.hFTik3lf.js → guides_webhooks.md.B1EswtUu.js} +2 -2
- package/dist/docs/assets/index.md.m81y7TY7.js +20 -0
- package/dist/docs/assets/{index.md.BPKcj5AI.lean.js → index.md.m81y7TY7.lean.js} +1 -1
- package/dist/docs/assets/quickstart.md.BU6Iwi_9.js +204 -0
- package/dist/docs/assets/quickstart.md.BU6Iwi_9.lean.js +1 -0
- package/dist/docs/assets/{reference_agent-config.md.Bpd7HQwf.js → reference_agent-config.md.DrW2JUM8.js} +4 -4
- package/dist/docs/assets/{reference_agent-config.md.Bpd7HQwf.lean.js → reference_agent-config.md.DrW2JUM8.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.D7JTR03W.js → reference_channels.md.DdmiKgqf.js} +4 -4
- package/dist/docs/assets/{reference_channels.md.D7JTR03W.lean.js → reference_channels.md.DdmiKgqf.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DA730zCu.js → reference_cli.md.Bv6pOxcF.js} +11 -6
- package/dist/docs/assets/{reference_cli.md.DA730zCu.lean.js → reference_cli.md.Bv6pOxcF.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.C3vNH_DE.js → reference_connections.md.zaEYCLHT.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.BCEc3MyM.js → reference_hooks.md.DyLVfE1O.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.BCEc3MyM.lean.js → reference_hooks.md.DyLVfE1O.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.DBAahtdz.js → reference_http-api.md.Dx_nmDG6.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.BC05LEQ8.js → reference_instructions.md.CgoV-YEb.js} +9 -7
- package/dist/docs/assets/{reference_instructions.md.BC05LEQ8.lean.js → reference_instructions.md.CgoV-YEb.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.D7qijxLk.js → reference_schedules.md.w_F2mXB6.js} +2 -2
- package/dist/docs/assets/{reference_skills.md.VQnlBT3Q.js → reference_skills.md.B_jHN7JL.js} +3 -3
- package/dist/docs/assets/{reference_skills.md.VQnlBT3Q.lean.js → reference_skills.md.B_jHN7JL.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.CIRAVcPK.js → reference_subagents.md.zWAMNfi1.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.DF5kwlt0.js → reference_tools.md.CqgJroI0.js} +2 -2
- package/dist/docs/assets/scaffolding-agents.md.C3pTrmoE.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.C3pTrmoE.lean.js +1 -0
- package/dist/docs/assets/storage.md.CVnInNiN.js +17 -0
- package/dist/docs/assets/storage.md.CVnInNiN.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 +7 -7
- package/dist/docs/evals.html +7 -7
- package/dist/docs/guides/agent-to-agent.html +6 -6
- package/dist/docs/guides/cloud-runtime.html +5 -5
- package/dist/docs/guides/github.html +14 -7
- package/dist/docs/guides/human-in-the-loop.html +6 -6
- package/dist/docs/guides/slack.html +8 -8
- package/dist/docs/guides/webhooks.html +6 -6
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +5 -5
- package/dist/docs/index.html +7 -7
- package/dist/docs/quickstart.html +195 -26
- package/dist/docs/reference/agent-config.html +7 -7
- package/dist/docs/reference/channels.html +8 -8
- package/dist/docs/reference/cli.html +14 -9
- package/dist/docs/reference/connections.html +5 -5
- package/dist/docs/reference/hooks.html +5 -5
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/instructions.html +13 -11
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/schedules.html +7 -7
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +6 -6
- package/dist/docs/reference/subagents.html +6 -6
- package/dist/docs/reference/tools.html +7 -7
- package/dist/docs/scaffolding-agents.html +5 -5
- package/dist/docs/storage.html +41 -0
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/chat-client.d.ts +29 -3
- package/dist/internal/chat-client.d.ts.map +1 -1
- package/dist/internal/chat-client.js +180 -27
- package/dist/internal/cli-ax.d.ts +75 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +600 -52
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +8 -36
- package/dist/internal/cli-deploy.d.ts +108 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -0
- package/dist/internal/cli-deploy.js +1009 -0
- package/dist/internal/cursor/backend-client.d.ts +10 -1
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +79 -1
- package/dist/internal/cursor/credentials.d.ts +9 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +12 -0
- package/dist/internal/cursor/github-credentials.d.ts +44 -0
- package/dist/internal/cursor/github-credentials.d.ts.map +1 -0
- package/dist/internal/cursor/github-credentials.js +195 -0
- package/dist/internal/deploy-client.d.ts +184 -0
- package/dist/internal/deploy-client.d.ts.map +1 -0
- package/dist/internal/deploy-client.js +395 -0
- package/dist/internal/deploy-source.d.ts +35 -0
- package/dist/internal/deploy-source.d.ts.map +1 -0
- package/dist/internal/deploy-source.js +118 -0
- package/dist/internal/discovery.d.ts +11 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +116 -19
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/eval-run-store.d.ts +22 -3
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +39 -20
- package/dist/internal/eval-runner.d.ts +2 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +2 -0
- package/dist/internal/event-mapper.d.ts +54 -1
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +151 -41
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +10 -12
- package/dist/internal/host-platforms.d.ts +7 -2
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +15 -10
- package/dist/internal/hosting.d.ts +37 -0
- package/dist/internal/hosting.d.ts.map +1 -0
- package/dist/internal/hosting.js +67 -0
- package/dist/internal/init-project.d.ts +88 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +221 -31
- package/dist/internal/install-cursor-skills.d.ts +64 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -0
- package/dist/internal/install-cursor-skills.js +274 -0
- package/dist/internal/logs-client.d.ts +60 -0
- package/dist/internal/logs-client.d.ts.map +1 -0
- package/dist/internal/logs-client.js +311 -0
- package/dist/internal/open-browser.d.ts +5 -0
- package/dist/internal/open-browser.d.ts.map +1 -0
- package/dist/internal/open-browser.js +34 -0
- package/dist/internal/playground/toolchain.d.ts.map +1 -1
- package/dist/internal/playground/toolchain.js +16 -11
- package/dist/internal/playground-proxy.d.ts +69 -0
- package/dist/internal/playground-proxy.d.ts.map +1 -0
- package/dist/internal/playground-proxy.js +468 -0
- package/dist/internal/prompt-context.d.ts +35 -0
- package/dist/internal/prompt-context.d.ts.map +1 -0
- package/dist/internal/prompt-context.js +71 -0
- package/dist/internal/reminder-runner.d.ts +7 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +50 -6
- package/dist/internal/reminder-store.d.ts +2 -0
- package/dist/internal/reminder-store.d.ts.map +1 -1
- package/dist/internal/reminder-store.js +18 -0
- package/dist/internal/request-headers.d.ts +11 -0
- package/dist/internal/request-headers.d.ts.map +1 -0
- package/dist/internal/request-headers.js +14 -0
- package/dist/internal/resolve-prod-target.d.ts +42 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -0
- package/dist/internal/resolve-prod-target.js +111 -0
- package/dist/internal/run-client.d.ts +2 -2
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +38 -23
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +182 -45
- package/dist/internal/session-engine.d.ts +50 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +267 -23
- package/dist/internal/sessions-client.d.ts +21 -0
- package/dist/internal/sessions-client.d.ts.map +1 -0
- package/dist/internal/sessions-client.js +168 -0
- package/dist/internal/storage-coordinator.d.ts +139 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -0
- package/dist/internal/storage-coordinator.js +499 -0
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +31 -3
- package/dist/internal/terminal-style.d.ts +22 -0
- package/dist/internal/terminal-style.d.ts.map +1 -0
- package/dist/internal/terminal-style.js +49 -0
- package/dist/internal/trajectory.d.ts +10 -5
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +82 -10
- package/dist/internal/workspace.d.ts +11 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +38 -4
- package/dist/playground/assets/cursor-icons-outline-BxTT_FVJ.woff2 +0 -0
- package/dist/playground/assets/index-D-vo2lV_.css +1 -0
- package/dist/playground/assets/index-x60b9q2j.js +312 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage.d.ts +204 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +153 -0
- package/dist/types.d.ts +70 -4
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +3 -2
- package/docs/guides/github.md +43 -8
- package/docs/guides/slack.md +1 -1
- package/docs/quickstart.md +350 -57
- package/docs/reference/cli.md +51 -3
- package/docs/reference/instructions.md +8 -6
- package/docs/scaffolding-agents.md +1 -1
- package/docs/storage.md +98 -0
- package/package.json +10 -1
- package/skills/ab/SKILL.md +8 -8
- package/skills/create-agent/SKILL.md +28 -22
- package/skills/debug/SKILL.md +11 -11
- package/skills/evals/SKILL.md +16 -16
- package/skills/framework-map/SKILL.md +6 -6
- package/skills/github/SKILL.md +22 -14
- package/skills/hillclimb/SKILL.md +10 -10
- package/skills/setup-slack/SKILL.md +13 -13
- package/src/bin/agent-serve.ts +552 -179
- package/src/channels/github/api.ts +42 -23
- package/src/channels/github/cursor-account.ts +165 -0
- package/src/channels/github/github-channel.ts +66 -6
- package/src/channels/github/index.ts +2 -2
- package/src/channels/github/types.ts +19 -0
- package/src/channels/slack/slack-channel.ts +17 -3
- package/src/channels/slack/types.ts +44 -3
- package/src/index.ts +13 -0
- package/src/internal/chat-client.ts +252 -37
- package/src/internal/cli-ax.ts +722 -72
- package/src/internal/cli-cursor.ts +14 -42
- package/src/internal/cli-deploy.ts +1319 -0
- package/src/internal/cursor/backend-client.ts +103 -1
- package/src/internal/cursor/credentials.ts +14 -0
- package/src/internal/cursor/github-credentials.ts +248 -0
- package/src/internal/deploy-client.ts +632 -0
- package/src/internal/deploy-source.ts +133 -0
- package/src/internal/discovery.ts +141 -17
- package/src/internal/distribution.ts +1 -0
- package/src/internal/eval-run-store.ts +50 -20
- package/src/internal/eval-runner.ts +5 -0
- package/src/internal/event-mapper.ts +222 -42
- package/src/internal/handleAgentServeTrigger.ts +10 -12
- package/src/internal/host-platforms.ts +28 -11
- package/src/internal/hosting.ts +77 -0
- package/src/internal/init-project.ts +333 -51
- package/src/internal/install-cursor-skills.ts +327 -0
- package/src/internal/logs-client.ts +442 -0
- package/src/internal/open-browser.ts +41 -0
- package/src/internal/playground/toolchain.ts +15 -13
- package/src/internal/playground-proxy.ts +576 -0
- package/src/internal/prompt-context.ts +95 -0
- package/src/internal/reminder-runner.ts +50 -6
- package/src/internal/reminder-store.ts +21 -0
- package/src/internal/request-headers.ts +23 -0
- package/src/internal/resolve-prod-target.ts +150 -0
- package/src/internal/run-client.ts +39 -36
- package/src/internal/server.ts +223 -28
- package/src/internal/session-engine.ts +307 -10
- package/src/internal/sessions-client.ts +182 -0
- package/src/internal/storage-coordinator.ts +615 -0
- package/src/internal/stream-progress.ts +36 -2
- package/src/internal/terminal-style.ts +74 -0
- package/src/internal/trajectory.ts +91 -13
- package/src/internal/workspace.ts +42 -4
- package/src/storage.ts +325 -0
- package/src/types.ts +82 -8
- package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +0 -1
- package/dist/docs/assets/index.md.BPKcj5AI.js +0 -20
- package/dist/docs/assets/quickstart.md.tVPiGK_L.js +0 -35
- package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +0 -1
- package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
- package/dist/playground/assets/index-1K-hG-7p.css +0 -1
- package/dist/playground/assets/index-FlWjhg3x.js +0 -79
- /package/dist/docs/assets/{evals.md.DPZ_MAnI.lean.js → evals.md.DAgEc_hL.lean.js} +0 -0
- /package/dist/docs/assets/{guides_agent-to-agent.md.CrtrsySy.lean.js → guides_agent-to-agent.md.Bpzgq2Pq.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-runtime.md.CYlNMTNp.lean.js → guides_cloud-runtime.md.gVzabdQL.lean.js} +0 -0
- /package/dist/docs/assets/{guides_human-in-the-loop.md.Dvuctx7s.lean.js → guides_human-in-the-loop.md.DlUqsp1S.lean.js} +0 -0
- /package/dist/docs/assets/{guides_webhooks.md.hFTik3lf.lean.js → guides_webhooks.md.B1EswtUu.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.C3vNH_DE.lean.js → reference_connections.md.zaEYCLHT.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.DBAahtdz.lean.js → reference_http-api.md.Dx_nmDG6.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.D7qijxLk.lean.js → reference_schedules.md.w_F2mXB6.lean.js} +0 -0
- /package/dist/docs/assets/{reference_subagents.md.CIRAVcPK.lean.js → reference_subagents.md.zWAMNfi1.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.DF5kwlt0.lean.js → reference_tools.md.CqgJroI0.lean.js} +0 -0
|
@@ -4,11 +4,19 @@
|
|
|
4
4
|
* (`SessionEvent` payloads). One mapper instance covers one turn.
|
|
5
5
|
*/
|
|
6
6
|
const CUSTOM_TOOLS_PROVIDER = "custom-user-tools";
|
|
7
|
+
function asToolCallDelta(update) {
|
|
8
|
+
if (update.type !== "tool-call-delta") {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return update;
|
|
12
|
+
}
|
|
7
13
|
export class TurnEventMapper {
|
|
8
14
|
constructor(emit) {
|
|
9
15
|
this.emit = emit;
|
|
10
16
|
this.textAccumulator = "";
|
|
11
17
|
this.reasoningAccumulator = "";
|
|
18
|
+
/** Per-parent-call accumulators for nested subagent streams. */
|
|
19
|
+
this.nested = new Map();
|
|
12
20
|
}
|
|
13
21
|
/** Per-turn token usage summed across model steps. */
|
|
14
22
|
get usage() {
|
|
@@ -52,49 +60,11 @@ export class TurnEventMapper {
|
|
|
52
60
|
}
|
|
53
61
|
case "tool-call-started": {
|
|
54
62
|
this.flushAssistantText("tool_call");
|
|
55
|
-
|
|
56
|
-
this.emit({
|
|
57
|
-
type: "actions.requested",
|
|
58
|
-
data: {
|
|
59
|
-
calls: [
|
|
60
|
-
{
|
|
61
|
-
callId: update.callId,
|
|
62
|
-
toolName: description.toolName,
|
|
63
|
-
args: description.args,
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
if (description.subagent !== undefined) {
|
|
69
|
-
this.emit({
|
|
70
|
-
type: "subagent.called",
|
|
71
|
-
data: {
|
|
72
|
-
callId: update.callId,
|
|
73
|
-
name: description.subagent.name,
|
|
74
|
-
description: description.subagent.description,
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
}
|
|
63
|
+
this.emitToolStarted(update.callId, update.toolCall);
|
|
78
64
|
return;
|
|
79
65
|
}
|
|
80
66
|
case "tool-call-completed": {
|
|
81
|
-
|
|
82
|
-
const result = describeToolResult(update.toolCall);
|
|
83
|
-
this.emit({
|
|
84
|
-
type: "action.result",
|
|
85
|
-
data: {
|
|
86
|
-
callId: update.callId,
|
|
87
|
-
toolName: description.toolName,
|
|
88
|
-
output: result.output,
|
|
89
|
-
isError: result.isError,
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
if (description.subagent !== undefined) {
|
|
93
|
-
this.emit({
|
|
94
|
-
type: "subagent.completed",
|
|
95
|
-
data: { callId: update.callId, name: description.subagent.name },
|
|
96
|
-
});
|
|
97
|
-
}
|
|
67
|
+
this.emitToolCompleted(update.callId, update.toolCall);
|
|
98
68
|
return;
|
|
99
69
|
}
|
|
100
70
|
case "step-started": {
|
|
@@ -126,7 +96,13 @@ export class TurnEventMapper {
|
|
|
126
96
|
case "shell-output-delta":
|
|
127
97
|
return;
|
|
128
98
|
default: {
|
|
129
|
-
//
|
|
99
|
+
// Nested task/subagent progress (tool-call-delta) — accepted via
|
|
100
|
+
// structural check so we typecheck against older published SDKs.
|
|
101
|
+
const delta = asToolCallDelta(update);
|
|
102
|
+
if (delta !== undefined) {
|
|
103
|
+
this.handleNestedTaskUpdate(delta.callId, delta.taskUpdate);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
130
106
|
return;
|
|
131
107
|
}
|
|
132
108
|
}
|
|
@@ -134,6 +110,128 @@ export class TurnEventMapper {
|
|
|
134
110
|
/** Close out the turn: finalize any open assistant text block. */
|
|
135
111
|
finish() {
|
|
136
112
|
this.flushAssistantText("stop");
|
|
113
|
+
for (const parentCallId of this.nested.keys()) {
|
|
114
|
+
this.flushNestedAssistantText(parentCallId, "stop");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
handleNestedTaskUpdate(parentCallId, update) {
|
|
118
|
+
switch (update.type) {
|
|
119
|
+
case "text-delta": {
|
|
120
|
+
const acc = this.ensureNested(parentCallId);
|
|
121
|
+
acc.text += update.text;
|
|
122
|
+
this.emit({
|
|
123
|
+
type: "message.appended",
|
|
124
|
+
data: {
|
|
125
|
+
delta: update.text,
|
|
126
|
+
text: acc.text,
|
|
127
|
+
parentCallId,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
case "thinking-delta": {
|
|
133
|
+
const acc = this.ensureNested(parentCallId);
|
|
134
|
+
acc.reasoning += update.text;
|
|
135
|
+
this.emit({
|
|
136
|
+
type: "reasoning.appended",
|
|
137
|
+
data: {
|
|
138
|
+
delta: update.text,
|
|
139
|
+
text: acc.reasoning,
|
|
140
|
+
parentCallId,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
case "thinking-completed": {
|
|
146
|
+
const acc = this.nested.get(parentCallId);
|
|
147
|
+
if (acc !== undefined && acc.reasoning !== "") {
|
|
148
|
+
acc.reasoning = "";
|
|
149
|
+
}
|
|
150
|
+
this.emit({
|
|
151
|
+
type: "reasoning.completed",
|
|
152
|
+
data: {
|
|
153
|
+
durationMs: update.thinkingDurationMs,
|
|
154
|
+
parentCallId,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
case "tool-call-started": {
|
|
160
|
+
this.flushNestedAssistantText(parentCallId, "tool_call");
|
|
161
|
+
this.emitToolStarted(update.callId, update.toolCall, parentCallId);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
case "tool-call-completed": {
|
|
165
|
+
this.emitToolCompleted(update.callId, update.toolCall, parentCallId);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
case "partial-tool-call":
|
|
169
|
+
case "step-started":
|
|
170
|
+
case "step-completed":
|
|
171
|
+
return;
|
|
172
|
+
default: {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
emitToolStarted(callId, toolCall, parentCallId) {
|
|
178
|
+
const description = describeToolCall(toolCall);
|
|
179
|
+
this.emit({
|
|
180
|
+
type: "actions.requested",
|
|
181
|
+
data: {
|
|
182
|
+
calls: [
|
|
183
|
+
{
|
|
184
|
+
callId,
|
|
185
|
+
toolName: description.toolName,
|
|
186
|
+
args: description.args,
|
|
187
|
+
parentCallId,
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
parentCallId,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
// Subagent bookends only fire for the top-level task tool, not nested
|
|
194
|
+
// tools inside a subagent (nested subagents aren't supported).
|
|
195
|
+
if (description.subagent !== undefined && parentCallId === undefined) {
|
|
196
|
+
this.emit({
|
|
197
|
+
type: "subagent.called",
|
|
198
|
+
data: {
|
|
199
|
+
callId,
|
|
200
|
+
name: description.subagent.name,
|
|
201
|
+
description: description.subagent.description,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
emitToolCompleted(callId, toolCall, parentCallId) {
|
|
207
|
+
const description = describeToolCall(toolCall);
|
|
208
|
+
const result = describeToolResult(toolCall);
|
|
209
|
+
this.emit({
|
|
210
|
+
type: "action.result",
|
|
211
|
+
data: {
|
|
212
|
+
callId,
|
|
213
|
+
toolName: description.toolName,
|
|
214
|
+
output: result.output,
|
|
215
|
+
isError: result.isError,
|
|
216
|
+
parentCallId,
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
if (description.subagent !== undefined && parentCallId === undefined) {
|
|
220
|
+
this.flushNestedAssistantText(callId, "stop");
|
|
221
|
+
this.nested.delete(callId);
|
|
222
|
+
this.emit({
|
|
223
|
+
type: "subagent.completed",
|
|
224
|
+
data: { callId, name: description.subagent.name },
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
ensureNested(parentCallId) {
|
|
229
|
+
let acc = this.nested.get(parentCallId);
|
|
230
|
+
if (acc === undefined) {
|
|
231
|
+
acc = { text: "", reasoning: "" };
|
|
232
|
+
this.nested.set(parentCallId, acc);
|
|
233
|
+
}
|
|
234
|
+
return acc;
|
|
137
235
|
}
|
|
138
236
|
flushAssistantText(finishReason) {
|
|
139
237
|
if (this.textAccumulator === "") {
|
|
@@ -147,6 +245,18 @@ export class TurnEventMapper {
|
|
|
147
245
|
data: { text, finishReason },
|
|
148
246
|
});
|
|
149
247
|
}
|
|
248
|
+
flushNestedAssistantText(parentCallId, finishReason) {
|
|
249
|
+
const acc = this.nested.get(parentCallId);
|
|
250
|
+
if (acc === undefined || acc.text === "") {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const text = acc.text;
|
|
254
|
+
acc.text = "";
|
|
255
|
+
this.emit({
|
|
256
|
+
type: "message.completed",
|
|
257
|
+
data: { text, finishReason, parentCallId },
|
|
258
|
+
});
|
|
259
|
+
}
|
|
150
260
|
}
|
|
151
261
|
/**
|
|
152
262
|
* Human-meaningful tool identity for stream events. In-process tools calls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleAgentServeTrigger.d.ts","sourceRoot":"","sources":["../../src/internal/handleAgentServeTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,6BAA6B;IAC5C,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,EAAE,oBAAoB,CAAC;IAC9B,uEAAuE;IACvE,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAElE,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,CAAC;KAC7D,CAAC,CAAC;CACJ,GAAG,6BAA6B,EAAE,
|
|
1
|
+
{"version":3,"file":"handleAgentServeTrigger.d.ts","sourceRoot":"","sources":["../../src/internal/handleAgentServeTrigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,6BAA6B;IAC5C,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,OAAO,EAAE,oBAAoB,CAAC;IAC9B,uEAAuE;IACvE,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAElE,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,CAAC;KAC7D,CAAC,CAAC;CACJ,GAAG,6BAA6B,EAAE,CAgBlC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAYlC"}
|
|
@@ -26,19 +26,17 @@ import { dispatchGitHubWebhook, getGitHubChannelOptions, } from "../channels/git
|
|
|
26
26
|
export function collectGitHubTriggerTargets(input) {
|
|
27
27
|
const targets = [];
|
|
28
28
|
for (const mount of input.mounts) {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
for (const channel of mount.channels) {
|
|
30
|
+
const options = getGitHubChannelOptions(channel.definition);
|
|
31
|
+
if (options === undefined) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
targets.push({
|
|
35
|
+
slug: mount.slug,
|
|
36
|
+
options,
|
|
37
|
+
args: mount.buildHandlerArgs(channel.id),
|
|
38
|
+
});
|
|
36
39
|
}
|
|
37
|
-
targets.push({
|
|
38
|
-
slug: mount.slug,
|
|
39
|
-
options,
|
|
40
|
-
args: mount.buildHandlerArgs("github"),
|
|
41
|
-
});
|
|
42
40
|
}
|
|
43
41
|
return targets;
|
|
44
42
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Host-side GitHub + Slack clients shared across tools, channel routes,
|
|
3
3
|
* schedules, and channel packs — same injection pattern as MCP.
|
|
4
4
|
*/
|
|
5
|
+
import type { GitHubChannelCredentials } from "../channels/github/types.js";
|
|
5
6
|
import type { HostGitHubClient, HostSlackClient } from "../types.js";
|
|
6
7
|
export interface HostPlatforms {
|
|
7
8
|
github: HostGitHubClient;
|
|
@@ -12,13 +13,16 @@ export interface HostPlatforms {
|
|
|
12
13
|
* `app` = GitHub App installation token (preferred in production).
|
|
13
14
|
* `env` / `gh` = local PAT / CLI fallbacks when App creds are unset.
|
|
14
15
|
*/
|
|
15
|
-
export type HostGitHubAuthSource = "app" | "env" | "gh" | "unavailable";
|
|
16
|
+
export type HostGitHubAuthSource = "app" | "cursor-account" | "env" | "gh" | "unavailable";
|
|
17
|
+
export interface HostPlatformsOptions {
|
|
18
|
+
githubCredentials?: GitHubChannelCredentials;
|
|
19
|
+
}
|
|
16
20
|
/**
|
|
17
21
|
* Build host platforms from ambient credentials. Prefer App installation
|
|
18
22
|
* auth when configured; otherwise fall back to PAT / `gh auth` for local
|
|
19
23
|
* testing. Webhook-scoped calls should still prefer `ctx.github`.
|
|
20
24
|
*/
|
|
21
|
-
export declare function createHostPlatforms(): HostPlatforms;
|
|
25
|
+
export declare function createHostPlatforms(options?: HostPlatformsOptions): HostPlatforms;
|
|
22
26
|
/**
|
|
23
27
|
* Detect ambient host GitHub auth without throwing.
|
|
24
28
|
* Order matches {@link createGitHubOctokit}: App installation, then
|
|
@@ -36,5 +40,6 @@ export declare function resolveHostGitHubAuthSource(): Promise<HostGitHubAuthSou
|
|
|
36
40
|
export declare function warmupHostGitHubAuth(options: {
|
|
37
41
|
logger: (line: string) => void;
|
|
38
42
|
github?: HostGitHubClient;
|
|
43
|
+
authSource?: HostGitHubAuthSource;
|
|
39
44
|
}): Promise<HostGitHubAuthSource>;
|
|
40
45
|
//# sourceMappingURL=host-platforms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-platforms.d.ts","sourceRoot":"","sources":["../../src/internal/host-platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"host-platforms.d.ts","sourceRoot":"","sources":["../../src/internal/host-platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAE5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC5B,KAAK,GACL,gBAAgB,GAChB,KAAK,GACL,IAAI,GACJ,aAAa,CAAC;AAElB,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,oBAAyB,GACjC,aAAa,CA8Bf;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAejF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgDhC"}
|
|
@@ -20,13 +20,15 @@ import { tryResolveBotToken } from "../channels/slack/credentials.js";
|
|
|
20
20
|
* auth when configured; otherwise fall back to PAT / `gh auth` for local
|
|
21
21
|
* testing. Webhook-scoped calls should still prefer `ctx.github`.
|
|
22
22
|
*/
|
|
23
|
-
export function createHostPlatforms() {
|
|
23
|
+
export function createHostPlatforms(options = {}) {
|
|
24
24
|
let octokitPromise;
|
|
25
25
|
let slackPromise;
|
|
26
26
|
return {
|
|
27
27
|
github: {
|
|
28
28
|
getOctokit: () => {
|
|
29
|
-
octokitPromise !== null && octokitPromise !== void 0 ? octokitPromise : (octokitPromise = createGitHubOctokit({
|
|
29
|
+
octokitPromise !== null && octokitPromise !== void 0 ? octokitPromise : (octokitPromise = createGitHubOctokit({
|
|
30
|
+
credentials: options.githubCredentials,
|
|
31
|
+
}));
|
|
30
32
|
return octokitPromise;
|
|
31
33
|
},
|
|
32
34
|
},
|
|
@@ -76,7 +78,8 @@ export function resolveHostGitHubAuthSource() {
|
|
|
76
78
|
*/
|
|
77
79
|
export function warmupHostGitHubAuth(options) {
|
|
78
80
|
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
|
|
81
|
+
var _a;
|
|
82
|
+
const source = (_a = options.authSource) !== null && _a !== void 0 ? _a : (yield resolveHostGitHubAuthSource());
|
|
80
83
|
if (source === "unavailable") {
|
|
81
84
|
options.logger("[agent-serve] GitHub auth: unavailable (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + GITHUB_APP_INSTALLATION_ID, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)");
|
|
82
85
|
return source;
|
|
@@ -90,13 +93,15 @@ export function warmupHostGitHubAuth(options) {
|
|
|
90
93
|
options.logger(`[agent-serve] GitHub auth: failed to export GH_TOKEN for gh CLI: ${error instanceof Error ? error.message : String(error)}`);
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
|
-
const label = source === "
|
|
94
|
-
?
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
:
|
|
96
|
+
const label = source === "cursor-account"
|
|
97
|
+
? "Cursor account repo-scoped credential (also exported as GH_TOKEN for gh CLI)"
|
|
98
|
+
: source === "app"
|
|
99
|
+
? exportedGhToken
|
|
100
|
+
? "GitHub App installation token (also exported as GH_TOKEN for gh CLI)"
|
|
101
|
+
: "GitHub App installation token"
|
|
102
|
+
: source === "env"
|
|
103
|
+
? "GITHUB_TOKEN/GH_TOKEN"
|
|
104
|
+
: "gh auth token";
|
|
100
105
|
if (options.github === undefined) {
|
|
101
106
|
options.logger(`[agent-serve] GitHub auth: ${label}`);
|
|
102
107
|
return source;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side mirrors of the Agent Serve hosting validation rules
|
|
3
|
+
* (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
|
|
4
|
+
* (`hosting` block diagnostics on `agentkit validate`) and the deploy /
|
|
5
|
+
* secrets CLI verbs (actionable errors before any network call). The
|
|
6
|
+
* backend stays authoritative — these exist so mistakes fail fast and
|
|
7
|
+
* locally with the same grammar the server enforces.
|
|
8
|
+
*/
|
|
9
|
+
/** `hosting.egressDomains` cap (backend caps the deploy body at 20). */
|
|
10
|
+
export declare const MAX_EGRESS_DOMAINS = 20;
|
|
11
|
+
/** Max secrets per deployment. */
|
|
12
|
+
export declare const MAX_SECRETS = 32;
|
|
13
|
+
/** Max secret value size in bytes. */
|
|
14
|
+
export declare const MAX_SECRET_VALUE_BYTES = 4096;
|
|
15
|
+
/** Max secret name length. */
|
|
16
|
+
export declare const MAX_SECRET_NAME_LENGTH = 64;
|
|
17
|
+
/** Secret names the platform injects; user writes are rejected. */
|
|
18
|
+
export declare const RESERVED_SECRET_NAME_PREFIX = "CURSOR_";
|
|
19
|
+
/** Returns a human error message, or undefined when the domain is valid. */
|
|
20
|
+
export declare function validateEgressDomain(domain: string): string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Returns a human error message, or undefined when the name is a valid
|
|
23
|
+
* secret name. Grammar only — reserved names are checked separately so the
|
|
24
|
+
* manifest's declarative `secretNames` can mention them with a softer
|
|
25
|
+
* diagnostic than the hard write-time rejection.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateSecretName(name: string): string | undefined;
|
|
28
|
+
/** True when the platform reserves this name (`CURSOR_*`); writes are rejected. */
|
|
29
|
+
export declare function isReservedSecretName(name: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Human error for a secret name a user is trying to write or delete:
|
|
32
|
+
* grammar plus the reserved `CURSOR_*` prefix.
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateSettableSecretName(name: string): string | undefined;
|
|
35
|
+
/** `owner/name` — mirrors the backend's cursor-event repo grammar. */
|
|
36
|
+
export declare function isValidCursorEventRepo(repo: string): boolean;
|
|
37
|
+
//# sourceMappingURL=hosting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosting.d.ts","sourceRoot":"","sources":["../../src/internal/hosting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,kCAAkC;AAClC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,sCAAsC;AACtC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,8BAA8B;AAC9B,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,YAAY,CAAC;AASrD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQnE;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS3E;AAID,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side mirrors of the Agent Serve hosting validation rules
|
|
3
|
+
* (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
|
|
4
|
+
* (`hosting` block diagnostics on `agentkit validate`) and the deploy /
|
|
5
|
+
* secrets CLI verbs (actionable errors before any network call). The
|
|
6
|
+
* backend stays authoritative — these exist so mistakes fail fast and
|
|
7
|
+
* locally with the same grammar the server enforces.
|
|
8
|
+
*/
|
|
9
|
+
/** `hosting.egressDomains` cap (backend caps the deploy body at 20). */
|
|
10
|
+
export const MAX_EGRESS_DOMAINS = 20;
|
|
11
|
+
/** Max secrets per deployment. */
|
|
12
|
+
export const MAX_SECRETS = 32;
|
|
13
|
+
/** Max secret value size in bytes. */
|
|
14
|
+
export const MAX_SECRET_VALUE_BYTES = 4096;
|
|
15
|
+
/** Max secret name length. */
|
|
16
|
+
export const MAX_SECRET_NAME_LENGTH = 64;
|
|
17
|
+
/** Secret names the platform injects; user writes are rejected. */
|
|
18
|
+
export const RESERVED_SECRET_NAME_PREFIX = "CURSOR_";
|
|
19
|
+
const SECRET_NAME_PATTERN = /^[A-Z][A-Z0-9_]*$/;
|
|
20
|
+
// Lowercase hostname with >=2 labels, an alphabetic TLD, and at most one
|
|
21
|
+
// leading `*.` wildcard. Labels: alphanumeric with interior hyphens.
|
|
22
|
+
const EGRESS_DOMAIN_PATTERN = /^(\*\.)?([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z]+$/;
|
|
23
|
+
/** Returns a human error message, or undefined when the domain is valid. */
|
|
24
|
+
export function validateEgressDomain(domain) {
|
|
25
|
+
if (EGRESS_DOMAIN_PATTERN.test(domain)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return `Invalid egress domain ${JSON.stringify(domain)}: use a lowercase hostname with at least two labels and an alphabetic TLD (e.g. "api.example.com"), optionally with a single leading "*." wildcard.`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns a human error message, or undefined when the name is a valid
|
|
32
|
+
* secret name. Grammar only — reserved names are checked separately so the
|
|
33
|
+
* manifest's declarative `secretNames` can mention them with a softer
|
|
34
|
+
* diagnostic than the hard write-time rejection.
|
|
35
|
+
*/
|
|
36
|
+
export function validateSecretName(name) {
|
|
37
|
+
if (name.length > MAX_SECRET_NAME_LENGTH) {
|
|
38
|
+
return `Secret name ${JSON.stringify(name)} is too long (max ${MAX_SECRET_NAME_LENGTH} characters).`;
|
|
39
|
+
}
|
|
40
|
+
if (!SECRET_NAME_PATTERN.test(name)) {
|
|
41
|
+
return `Invalid secret name ${JSON.stringify(name)}: use UPPER_SNAKE_CASE starting with a letter (${SECRET_NAME_PATTERN}).`;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
/** True when the platform reserves this name (`CURSOR_*`); writes are rejected. */
|
|
46
|
+
export function isReservedSecretName(name) {
|
|
47
|
+
return name.startsWith(RESERVED_SECRET_NAME_PREFIX);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Human error for a secret name a user is trying to write or delete:
|
|
51
|
+
* grammar plus the reserved `CURSOR_*` prefix.
|
|
52
|
+
*/
|
|
53
|
+
export function validateSettableSecretName(name) {
|
|
54
|
+
const nameError = validateSecretName(name);
|
|
55
|
+
if (nameError !== undefined) {
|
|
56
|
+
return nameError;
|
|
57
|
+
}
|
|
58
|
+
if (isReservedSecretName(name)) {
|
|
59
|
+
return `Secret name ${JSON.stringify(name)} is platform-reserved (CURSOR_*); the platform injects those values automatically.`;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const CURSOR_EVENT_REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
64
|
+
/** `owner/name` — mirrors the backend's cursor-event repo grammar. */
|
|
65
|
+
export function isValidCursorEventRepo(repo) {
|
|
66
|
+
return CURSOR_EVENT_REPO_PATTERN.test(repo) && !repo.includes("..");
|
|
67
|
+
}
|
|
@@ -9,11 +9,98 @@ export interface InitProjectOptions {
|
|
|
9
9
|
/** Model id override written into agent.ts. */
|
|
10
10
|
model?: string;
|
|
11
11
|
}
|
|
12
|
+
export type InitFileAction = "create" | "exist";
|
|
13
|
+
export interface InitFileEntry {
|
|
14
|
+
path: string;
|
|
15
|
+
action: InitFileAction;
|
|
16
|
+
}
|
|
12
17
|
export interface InitProjectResult {
|
|
13
18
|
rootDir: string;
|
|
14
|
-
files
|
|
19
|
+
/** Scaffold files in write order, with create/exist for each. */
|
|
20
|
+
files: InitFileEntry[];
|
|
21
|
+
/** Paths newly written. */
|
|
22
|
+
created: string[];
|
|
23
|
+
/** Paths left alone because they already existed. */
|
|
24
|
+
skipped: string[];
|
|
15
25
|
}
|
|
16
26
|
export declare function initProject(options: InitProjectOptions): Promise<InitProjectResult>;
|
|
27
|
+
export interface InstallScaffoldDependenciesOptions {
|
|
28
|
+
/**
|
|
29
|
+
* `inherit` streams npm output to the terminal (human `init`);
|
|
30
|
+
* `pipe` captures it ( `--json` / tests).
|
|
31
|
+
*/
|
|
32
|
+
stdio?: "inherit" | "pipe";
|
|
33
|
+
/** Test seam — replaces the real `npm install` spawn. */
|
|
34
|
+
runner?: (args: {
|
|
35
|
+
command: string;
|
|
36
|
+
args: string[];
|
|
37
|
+
cwd: string;
|
|
38
|
+
stdio: "inherit" | "pipe";
|
|
39
|
+
}) => Promise<{
|
|
40
|
+
exitCode: number;
|
|
41
|
+
stderr: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export interface InstallScaffoldDependenciesResult {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
exitCode: number;
|
|
47
|
+
stderr: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Install the scaffold's npm dependencies so `dev` / `run` can resolve
|
|
51
|
+
* `@cursor/july` immediately after `init`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function installScaffoldDependencies(rootDir: string, options?: InstallScaffoldDependenciesOptions): Promise<InstallScaffoldDependenciesResult>;
|
|
54
|
+
export interface InitScaffoldSummaryOptions {
|
|
55
|
+
/** Scaffolded project root (absolute). */
|
|
56
|
+
rootDir: string;
|
|
57
|
+
/** Scaffold files in write order (`create` / `exist`). */
|
|
58
|
+
files: InitFileEntry[];
|
|
59
|
+
/** Override TTY color detection (tests / `--json` callers). */
|
|
60
|
+
color?: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface InitNextStepsOptions {
|
|
63
|
+
/** Scaffolded project root (absolute). */
|
|
64
|
+
rootDir: string;
|
|
65
|
+
/** Directory the command ran from. */
|
|
66
|
+
cwd: string;
|
|
67
|
+
/**
|
|
68
|
+
* True when a Cursor credential resolves. When false, next steps include
|
|
69
|
+
* `login` (used for `--json` and when an interactive login attempt failed).
|
|
70
|
+
*/
|
|
71
|
+
signedIn: boolean;
|
|
72
|
+
/** Override TTY color detection (tests / `--json` callers). */
|
|
73
|
+
color?: boolean;
|
|
74
|
+
}
|
|
75
|
+
export type InitSummaryOptions = InitScaffoldSummaryOptions & InitNextStepsOptions;
|
|
76
|
+
/**
|
|
77
|
+
* Created/skipped files plus the project path. Printed before an interactive
|
|
78
|
+
* login so the scaffold is visible while the browser flow runs.
|
|
79
|
+
*/
|
|
80
|
+
export declare function formatInitScaffoldSummary(options: InitScaffoldSummaryOptions): string;
|
|
81
|
+
/**
|
|
82
|
+
* Numbered next steps after scaffold (and after login when init ran it).
|
|
83
|
+
* Includes `cd` when init did not already run inside the project.
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatInitNextSteps(options: InitNextStepsOptions): string;
|
|
86
|
+
/**
|
|
87
|
+
* Full human-readable scaffold summary (scaffold + next steps).
|
|
88
|
+
*/
|
|
89
|
+
export declare function formatInitSummary(options: InitSummaryOptions): string;
|
|
90
|
+
/**
|
|
91
|
+
* `cd` into the scaffold when init did not already run inside it. Relative
|
|
92
|
+
* when the target sits under the invoking directory, absolute otherwise.
|
|
93
|
+
*/
|
|
94
|
+
export declare function formatCdCommand(cwd: string, rootDir: string): string | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Next-step commands for the `--json` scaffold summary (login omitted when
|
|
97
|
+
* the host already has a Cursor credential).
|
|
98
|
+
*/
|
|
99
|
+
export declare function initNextCommands(options: {
|
|
100
|
+
rootDir: string;
|
|
101
|
+
cwd: string;
|
|
102
|
+
signedIn: boolean;
|
|
103
|
+
}): string[];
|
|
17
104
|
/**
|
|
18
105
|
* Coding-agent setup guide printed by `agent-serve init`
|
|
19
106
|
* with no target directory (does not scaffold).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2BD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAgH5B;AAWD,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;KAC3B,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kCAAuC,GAC/C,OAAO,CAAC,iCAAiC,CAAC,CAW5C;AAkDD,MAAM,WAAW,0BAA0B;IACzC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,0BAA0B,GACzD,oBAAoB,CAAC;AAMvB;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAgBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAQpB;AAwBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,MAAM,EAAE,CAEX;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAsBrC"}
|