@cursor/july 0.1.24 → 0.1.26

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.
Files changed (205) hide show
  1. package/dist/bin/agent-serve.js +0 -0
  2. package/dist/channels/github/instrument.d.ts +20 -0
  3. package/dist/channels/github/instrument.d.ts.map +1 -0
  4. package/dist/docs/404.html +1 -1
  5. package/dist/docs/ab.html +2 -2
  6. package/dist/docs/assets/{app.CvSGaAxk.js → app.DYcC9FY-.js} +1 -1
  7. package/dist/docs/assets/chunks/@localSearchIndexroot.BQTzJjR_.js +1 -0
  8. package/dist/docs/assets/chunks/{VPLocalSearchBox.J1jJbCvs.js → VPLocalSearchBox.o4N_knTV.js} +1 -1
  9. package/dist/docs/assets/chunks/{theme.C7vfzr7h.js → theme.DQ-njyo0.js} +2 -2
  10. package/dist/docs/building-with-agents.html +2 -2
  11. package/dist/docs/concepts.html +2 -2
  12. package/dist/docs/deployment.html +2 -2
  13. package/dist/docs/evals.html +2 -2
  14. package/dist/docs/example-agents/approval-buddy.html +2 -2
  15. package/dist/docs/example-agents/benny.html +2 -2
  16. package/dist/docs/example-agents/bugbot.html +2 -2
  17. package/dist/docs/example-agents/codebase-wiki.html +2 -2
  18. package/dist/docs/example-agents/codeowners-review.html +2 -2
  19. package/dist/docs/example-agents/concierge.html +2 -2
  20. package/dist/docs/example-agents/fsd.html +2 -2
  21. package/dist/docs/example-agents/index.html +2 -2
  22. package/dist/docs/example-agents/knowledge-base.html +2 -2
  23. package/dist/docs/example-agents/oncall.html +2 -2
  24. package/dist/docs/example-agents/security-reviewer.html +2 -2
  25. package/dist/docs/example-agents/slack-agent.html +2 -2
  26. package/dist/docs/example-agents/weather-agent.html +2 -2
  27. package/dist/docs/guides/agent-to-agent.html +2 -2
  28. package/dist/docs/guides/cloud-runtime.html +2 -2
  29. package/dist/docs/guides/github.html +2 -2
  30. package/dist/docs/guides/human-in-the-loop.html +2 -2
  31. package/dist/docs/guides/mcp-oauth.html +2 -2
  32. package/dist/docs/guides/slack.html +2 -2
  33. package/dist/docs/guides/webhooks.html +2 -2
  34. package/dist/docs/hillclimbing.html +2 -2
  35. package/dist/docs/index.html +2 -2
  36. package/dist/docs/quickstart.html +2 -2
  37. package/dist/docs/reference/agent-config.html +2 -2
  38. package/dist/docs/reference/channels.html +2 -2
  39. package/dist/docs/reference/cli.html +2 -2
  40. package/dist/docs/reference/connections.html +2 -2
  41. package/dist/docs/reference/hooks.html +2 -2
  42. package/dist/docs/reference/http-api.html +2 -2
  43. package/dist/docs/reference/instructions.html +2 -2
  44. package/dist/docs/reference/playground.html +2 -2
  45. package/dist/docs/reference/project-layout.html +2 -2
  46. package/dist/docs/reference/prompt.html +2 -2
  47. package/dist/docs/reference/schedules.html +2 -2
  48. package/dist/docs/reference/sessions.html +2 -2
  49. package/dist/docs/reference/skills.html +2 -2
  50. package/dist/docs/reference/subagents.html +2 -2
  51. package/dist/docs/reference/tools.html +2 -2
  52. package/dist/docs/scaffolding-agents.html +2 -2
  53. package/dist/docs/storage.html +2 -2
  54. package/dist/docs/troubleshooting.html +2 -2
  55. package/dist/internal/json-dir-store.d.ts +32 -0
  56. package/dist/internal/json-dir-store.d.ts.map +1 -0
  57. package/dist/internal/json-dir-store.js +100 -0
  58. package/dist/playground/assets/index-CjOQ4hN9.css +1 -0
  59. package/dist/playground/assets/{index-DTG9OsPV.js → index-DqXdAFGa.js} +41 -41
  60. package/dist/playground/index.html +2 -2
  61. package/package.json +31 -24
  62. package/src/artifacts.ts +78 -0
  63. package/src/bin/agent-serve.version.test.ts +64 -0
  64. package/src/channels/github/api.test.ts +64 -0
  65. package/src/channels/github/auth.test.ts +105 -0
  66. package/src/channels/github/cursor-account.test.ts +204 -0
  67. package/src/channels/github/forward.test.ts +457 -0
  68. package/src/channels/github/github-channel.ts +19 -2
  69. package/src/channels/github/github.test.ts +985 -0
  70. package/src/channels/github/replay.test.ts +179 -0
  71. package/src/channels/github/types.ts +6 -0
  72. package/src/channels/slack/api.post-message.test.ts +148 -0
  73. package/src/channels/slack/api.ts +3 -1
  74. package/src/channels/slack/approvals.test.ts +328 -0
  75. package/src/channels/slack/block-actions.test.ts +469 -0
  76. package/src/channels/slack/bot-mentions.test.ts +267 -0
  77. package/src/channels/slack/channel-watch.test.ts +363 -0
  78. package/src/channels/slack/cursor-account.test.ts +301 -0
  79. package/src/channels/slack/cursor-account.ts +3 -1
  80. package/src/channels/slack/defaults.final-post.test.ts +182 -0
  81. package/src/channels/slack/dispatch.test.ts +875 -0
  82. package/src/channels/slack/dispatch.ts +12 -1
  83. package/src/channels/slack/eval-directive.test.ts +273 -0
  84. package/src/channels/slack/interactive.ts +3 -0
  85. package/src/channels/slack/message-body.test.ts +54 -0
  86. package/src/channels/slack/nudge-store.test.ts +143 -0
  87. package/src/channels/slack/slack-channel.ts +6 -0
  88. package/src/channels/slack/slack.test.ts +391 -0
  89. package/src/channels/slack/stop.test.ts +23 -0
  90. package/src/channels/slack/thread-context.test.ts +202 -0
  91. package/src/channels/slack/types.ts +6 -0
  92. package/src/evals/assertions.test.ts +617 -0
  93. package/src/evals/assertions.ts +37 -1
  94. package/src/evals/expect.test.ts +144 -0
  95. package/src/evals/judge.test.ts +181 -0
  96. package/src/evals/loaders.test.ts +132 -0
  97. package/src/evals/matchers.test.ts +95 -0
  98. package/src/evals/reporters.test.ts +303 -0
  99. package/src/evals/run-facts.test.ts +259 -0
  100. package/src/evals.ts +1 -0
  101. package/src/index.ts +1 -0
  102. package/src/internal/ab-snapshot.test.ts +325 -0
  103. package/src/internal/approval-gate.test.ts +49 -0
  104. package/src/internal/approvals.integration.test.ts +383 -0
  105. package/src/internal/artifacts-store.test.ts +283 -0
  106. package/src/internal/artifacts-store.ts +290 -0
  107. package/src/internal/authored-loaders.test.ts +31 -0
  108. package/src/internal/builtin-tools/artifacts.test.ts +247 -0
  109. package/src/internal/builtin-tools/artifacts.ts +74 -0
  110. package/src/internal/builtin-tools/index.ts +21 -0
  111. package/src/internal/builtin-tools/reminders.test.ts +201 -0
  112. package/src/internal/channel-route-schema.test.ts +294 -0
  113. package/src/internal/chat-attach.test.ts +262 -0
  114. package/src/internal/cli-deploy.test.ts +1991 -0
  115. package/src/internal/cli-docs.test.ts +161 -0
  116. package/src/internal/cli-mcp.test.ts +789 -0
  117. package/src/internal/cli-skills.test.ts +133 -0
  118. package/src/internal/cli-slack.test.ts +1654 -0
  119. package/src/internal/cli-slack.ts +13 -4
  120. package/src/internal/cloud-merge.test.ts +74 -0
  121. package/src/internal/cron.test.ts +22 -0
  122. package/src/internal/cursor/account-mcp.test.ts +807 -0
  123. package/src/internal/cursor/backend-client.test.ts +591 -0
  124. package/src/internal/cursor/credentials.test.ts +351 -0
  125. package/src/internal/cursor/github-credentials.test.ts +136 -0
  126. package/src/internal/cursor-account-mcp-auth.test.ts +310 -0
  127. package/src/internal/cursor-account.integration.test.ts +441 -0
  128. package/src/internal/cursor-event-relay.test.ts +746 -0
  129. package/src/internal/cursor-github-credentials.integration.test.ts +271 -0
  130. package/src/internal/cursor-slack-relay.test.ts +525 -0
  131. package/src/internal/deploy-source.test.ts +111 -0
  132. package/src/internal/discovery.artifact-tool.test.ts +136 -0
  133. package/src/internal/discovery.artifacts.test.ts +119 -0
  134. package/src/internal/discovery.builtin-tools.test.ts +94 -0
  135. package/src/internal/discovery.concurrency.test.ts +60 -0
  136. package/src/internal/discovery.cursor-account.test.ts +133 -0
  137. package/src/internal/discovery.cwd.test.ts +83 -0
  138. package/src/internal/discovery.hosting.test.ts +80 -0
  139. package/src/internal/discovery.identity.test.ts +44 -0
  140. package/src/internal/discovery.ts +102 -1
  141. package/src/internal/distribution.ts +1 -0
  142. package/src/internal/docs-site.test.ts +66 -0
  143. package/src/internal/duration.test.ts +29 -0
  144. package/src/internal/eval-judge-model.test.ts +187 -0
  145. package/src/internal/eval-run-store.cancel.test.ts +142 -0
  146. package/src/internal/eval-run-store.storage.test.ts +211 -0
  147. package/src/internal/eval-runner.http.test.ts +403 -0
  148. package/src/internal/eval-runner.run.test.ts +928 -0
  149. package/src/internal/evals-client.test.ts +307 -0
  150. package/src/internal/event-mapper.test.ts +243 -0
  151. package/src/internal/github-fanout.test.ts +213 -0
  152. package/src/internal/handleAgentServeTrigger.test.ts +185 -0
  153. package/src/internal/host-kv.test.ts +82 -0
  154. package/src/internal/host-platforms.test.ts +126 -0
  155. package/src/internal/http-channel.test.ts +402 -0
  156. package/src/internal/init-project.test.ts +270 -0
  157. package/src/internal/install-cursor-skills.test.ts +262 -0
  158. package/src/internal/local-env.test.ts +120 -0
  159. package/src/internal/log-ring.test.ts +31 -0
  160. package/src/internal/logs-client.test.ts +350 -0
  161. package/src/internal/mcp-endpoint.test.ts +436 -0
  162. package/src/internal/mcp-host.test.ts +298 -0
  163. package/src/internal/mcp-oauth.test.ts +148 -0
  164. package/src/internal/net.test.ts +17 -0
  165. package/src/internal/peer-connections.test.ts +128 -0
  166. package/src/internal/peer-mcp.integration.test.ts +289 -0
  167. package/src/internal/playground/toolchain.test.ts +53 -0
  168. package/src/internal/playground-cli.test.ts +187 -0
  169. package/src/internal/playground-proxy.test.ts +376 -0
  170. package/src/internal/prompt-context.integration.test.ts +232 -0
  171. package/src/internal/prompt-context.test.ts +127 -0
  172. package/src/internal/reminder-runner.test.ts +432 -0
  173. package/src/internal/reminder-runner.ts +1 -0
  174. package/src/internal/reminder-store.test.ts +53 -0
  175. package/src/internal/request-headers.test.ts +27 -0
  176. package/src/internal/resolve-prod-target.test.ts +787 -0
  177. package/src/internal/resolved-connections.test.ts +295 -0
  178. package/src/internal/router.test.ts +57 -0
  179. package/src/internal/schedule-runner.ts +1 -0
  180. package/src/internal/sdk-runner.test.ts +290 -0
  181. package/src/internal/server.artifacts.test.ts +334 -0
  182. package/src/internal/server.ts +45 -0
  183. package/src/internal/session-engine.artifacts.test.ts +293 -0
  184. package/src/internal/session-engine.coalesce.test.ts +169 -0
  185. package/src/internal/session-engine.concurrency.test.ts +250 -0
  186. package/src/internal/session-engine.host-oauth-mcp.test.ts +110 -0
  187. package/src/internal/session-engine.interrupt.test.ts +577 -0
  188. package/src/internal/session-engine.storage.test.ts +547 -0
  189. package/src/internal/session-engine.ts +129 -1
  190. package/src/internal/session-urls.test.ts +28 -0
  191. package/src/internal/sessions-client.test.ts +518 -0
  192. package/src/internal/storage-coordinator.test.ts +517 -0
  193. package/src/internal/storage-coordinator.ts +62 -0
  194. package/src/internal/tool-call.test.ts +458 -0
  195. package/src/internal/tool-result.test.ts +52 -0
  196. package/src/internal/trajectory.approvals.test.ts +83 -0
  197. package/src/internal/trajectory.subagents.test.ts +198 -0
  198. package/src/internal/turn-governor.test.ts +137 -0
  199. package/src/internal/update-check.test.ts +485 -0
  200. package/src/internal/workspace.test.ts +207 -0
  201. package/src/storage-backends/cursor-hosted.test.ts +121 -0
  202. package/src/storage.ts +6 -0
  203. package/src/types.ts +152 -2
  204. package/dist/docs/assets/chunks/@localSearchIndexroot.CL2Y0Zmh.js +0 -1
  205. package/dist/playground/assets/index-CidizGZv.css +0 -1
@@ -491,6 +491,16 @@ interface ConnectWaitTarget {
491
491
  notConnectedAt?: string;
492
492
  }
493
493
 
494
+ /**
495
+ * Slack's team-scoped admin page listing pending app-install requests.
496
+ * Provisioned apps have no OAuth flow (no redirect URLs, install-from-Slack
497
+ * disabled), so the oauth_authorize_url Slack returns from
498
+ * apps.manifest.create dead-ends; approval happens here instead.
499
+ */
500
+ function slackAppRequestsUrl(slackTeamId: string): string {
501
+ return `https://app.slack.com/apps-manage/${encodeURIComponent(slackTeamId)}/integrations/requests`;
502
+ }
503
+
494
504
  /** "Name (T0123ABCD)", or the bare id when the backend has no name. */
495
505
  function formatWorkspace(workspace: SlackConnectedWorkspace): string {
496
506
  const name = workspace.slackTeamName ?? "";
@@ -719,6 +729,7 @@ export async function cmdSlackCreate(
719
729
  const iconStatus = await applySlackCreateIcon(ctx, iconSource, result);
720
730
 
721
731
  if (result.status === "pending_admin_approval") {
732
+ const approveUrl = slackAppRequestsUrl(workspace.slackTeamId);
722
733
  if (ctx.json) {
723
734
  ctx.out(
724
735
  `${JSON.stringify(
@@ -729,7 +740,7 @@ export async function cmdSlackCreate(
729
740
  slackTeamId: workspace.slackTeamId,
730
741
  envKeys: target.envKeys,
731
742
  wrote,
732
- oauthAuthorizeUrl: result.oauthAuthorizeUrl ?? null,
743
+ approveUrl,
733
744
  iconStatus,
734
745
  },
735
746
  null,
@@ -739,9 +750,7 @@ export async function cmdSlackCreate(
739
750
  } else {
740
751
  ctx.err(
741
752
  `The Slack app was created (app ${result.appId}), but installing it needs a Slack workspace-admin approval.\n` +
742
- (result.oauthAuthorizeUrl === undefined
743
- ? ""
744
- : `\n Approve it (or send this to a workspace admin):\n\n ${result.oauthAuthorizeUrl}\n\n`) +
753
+ `\n A workspace admin can approve it here:\n\n ${approveUrl}\n\n` +
745
754
  `Once an admin approves the app, re-run \`${CLI} slack create\` to finish the install and mint the tokens.\n`
746
755
  );
747
756
  }
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { AgentCloudOptions } from "../types.js";
3
+ import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
4
+ import { isServerMintedCloudAgentId } from "./sdk-runner.js";
5
+
6
+ describe("mergeCloudOptions", () => {
7
+ const base: AgentCloudOptions = {
8
+ env: { type: "cloud" },
9
+ autoCreatePR: false,
10
+ envVars: { A: "1", B: "2" },
11
+ };
12
+
13
+ it("returns the other side when one is undefined", () => {
14
+ expect(mergeCloudOptions({ base, override: undefined })).toBe(base);
15
+ expect(mergeCloudOptions({ base: undefined, override: base })).toBe(base);
16
+ expect(
17
+ mergeCloudOptions({ base: undefined, override: undefined })
18
+ ).toBeUndefined();
19
+ });
20
+
21
+ it("lets the per-session override win on repos/env and deep-merges envVars", () => {
22
+ const merged = mergeCloudOptions({
23
+ base,
24
+ override: {
25
+ repos: [
26
+ {
27
+ url: "https://github.com/o/r",
28
+ prUrl: "https://github.com/o/r/pull/1",
29
+ },
30
+ ],
31
+ envVars: { B: "override", C: "3" },
32
+ },
33
+ });
34
+ expect(merged?.repos).toEqual([
35
+ { url: "https://github.com/o/r", prUrl: "https://github.com/o/r/pull/1" },
36
+ ]);
37
+ // Scalar base flags survive; envVars are deep-merged with override winning.
38
+ expect(merged?.autoCreatePR).toBe(false);
39
+ expect(merged?.envVars).toEqual({ A: "1", B: "override", C: "3" });
40
+ });
41
+ });
42
+
43
+ describe("resolveSessionRuntime", () => {
44
+ it("keeps the agent default when there is no cloud override", () => {
45
+ expect(
46
+ resolveSessionRuntime({
47
+ agentRuntime: "local",
48
+ cloudOverride: undefined,
49
+ })
50
+ ).toBe("local");
51
+ expect(
52
+ resolveSessionRuntime({
53
+ agentRuntime: "cloud",
54
+ cloudOverride: undefined,
55
+ })
56
+ ).toBe("cloud");
57
+ });
58
+
59
+ it("forces cloud when a per-session cloud override is set", () => {
60
+ expect(
61
+ resolveSessionRuntime({
62
+ agentRuntime: "local",
63
+ cloudOverride: { env: { type: "cloud" } },
64
+ })
65
+ ).toBe("cloud");
66
+ });
67
+ });
68
+
69
+ describe("isServerMintedCloudAgentId", () => {
70
+ it("resumes bc- ids and treats other ids as creation seeds", () => {
71
+ expect(isServerMintedCloudAgentId("bc-2dd32425-da03")).toBe(true);
72
+ expect(isServerMintedCloudAgentId("ses_abc")).toBe(false);
73
+ });
74
+ });
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { isValidCron, parseCron } from "./cron.js";
3
+
4
+ describe("parseCron (croner)", () => {
5
+ it("matches */5 on the five-minute mark", () => {
6
+ const cron = parseCron("*/5 * * * *");
7
+ expect(cron.matches(new Date("2026-07-09T18:55:00.000Z"))).toBe(true);
8
+ expect(cron.matches(new Date("2026-07-09T18:56:00.000Z"))).toBe(false);
9
+ });
10
+
11
+ it("returns the next fire after a given time", () => {
12
+ const cron = parseCron("0 9 * * 1-5");
13
+ const next = cron.nextFire(new Date("2026-07-09T08:00:00.000Z")); // Thursday
14
+ expect(next.toISOString()).toBe("2026-07-09T09:00:00.000Z");
15
+ });
16
+
17
+ it("rejects non-5-field expressions", () => {
18
+ expect(() => parseCron("* * * *")).toThrow(/5 fields/);
19
+ expect(isValidCron("0 9 * * 1-5")).toBe(true);
20
+ expect(isValidCron("not a cron")).toBe(false);
21
+ });
22
+ });