@cursor/july 0.1.103 → 0.1.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/change-monitors/change-monitors-channel.d.ts +5 -0
- package/dist/channels/change-monitors/change-monitors-channel.d.ts.map +1 -0
- package/dist/channels/change-monitors/change-monitors-channel.js +41 -0
- package/dist/channels/change-monitors/index.d.ts +4 -0
- package/dist/channels/change-monitors/index.d.ts.map +1 -0
- package/dist/channels/change-monitors/index.js +2 -0
- package/dist/channels/change-monitors/types.d.ts +39 -0
- package/dist/channels/change-monitors/types.d.ts.map +1 -0
- package/dist/channels/change-monitors/types.js +1 -0
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -0
- package/dist/channels/deployments/types.d.ts +2 -0
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/defaults.d.ts.map +1 -1
- package/dist/channels/github/defaults.js +4 -0
- package/dist/channels/github/progress.d.ts +22 -0
- package/dist/channels/github/progress.d.ts.map +1 -1
- package/dist/channels/github/progress.js +32 -5
- package/dist/channels/issues/index.d.ts +4 -0
- package/dist/channels/issues/index.d.ts.map +1 -0
- package/dist/channels/issues/index.js +2 -0
- package/dist/channels/issues/issues-channel.d.ts +5 -0
- package/dist/channels/issues/issues-channel.d.ts.map +1 -0
- package/dist/channels/issues/issues-channel.js +37 -0
- package/dist/channels/issues/types.d.ts +33 -0
- package/dist/channels/issues/types.d.ts.map +1 -0
- package/dist/channels/issues/types.js +1 -0
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.DW9pXkpL.js → app.BVwaffdK.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CdEIUwDg.js → VPLocalSearchBox.WuWTZ1x8.js} +1 -1
- package/dist/docs/assets/chunks/{theme.YZMHgPgg.js → theme.BYdI_6sF.js} +2 -2
- package/dist/docs/assets/{guides_github.md.DKYiT9do.js → guides_github.md.c0gdGJ-D.js} +1 -1
- package/dist/docs/assets/{guides_github.md.DKYiT9do.lean.js → guides_github.md.c0gdGJ-D.lean.js} +1 -1
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.js +9 -0
- package/dist/docs/assets/guides_grokbot-agents.md.DVqdhBKb.lean.js +1 -0
- package/dist/docs/assets/index.md.BW_6tOgR.js +5 -0
- package/dist/docs/assets/index.md.BW_6tOgR.lean.js +1 -0
- package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.js → reference_channels.md.DBGcaB7m.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.Dz8Cnudp.lean.js → reference_channels.md.DBGcaB7m.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CJNc_xYK.js → reference_cli.md.C6Lo8SEd.js} +2 -1
- package/dist/docs/assets/{reference_extensions.md.DykHW3qL.js → reference_extensions.md.CGmMLblt.js} +1 -1
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +3 -0
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/design/filesystem.md +376 -0
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-agents.html +5 -5
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +6 -6
- package/dist/docs/guides/github.md +5 -0
- package/dist/docs/guides/grokbot-agents.html +35 -0
- package/dist/docs/guides/grokbot-agents.md +88 -0
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +4 -4
- package/dist/docs/guides/opentelemetry.html +5 -5
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +6 -1
- package/dist/docs/llms-full.txt +562 -2
- package/dist/docs/llms.txt +3 -0
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +6 -6
- package/dist/docs/reference/channels.md +20 -0
- package/dist/docs/reference/cli.html +7 -6
- package/dist/docs/reference/cli.md +2 -1
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/extensions.html +6 -6
- package/dist/docs/reference/extensions.md +2 -0
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/result.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/ab.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/evals.html +4 -4
- package/dist/docs/skills/framework-map.html +4 -4
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +4 -4
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +4 -4
- package/dist/docs/skills/setup-slack.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +5 -5
- package/dist/docs/templates/demo.html +5 -5
- package/dist/docs/templates/grokbot-agents.html +29 -0
- package/dist/docs/templates/grokbot-agents.md +48 -0
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/files.d.ts +7 -2
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +7 -2
- package/dist/filesystem.d.ts +440 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +1694 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/continuation-channel.d.ts +4 -2
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +21 -12
- package/dist/internal/continuation-identity.d.ts +13 -5
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +74 -35
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +80 -8
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +3 -0
- package/dist/internal/factory-resource-channel.d.ts +33 -0
- package/dist/internal/factory-resource-channel.d.ts.map +1 -0
- package/dist/internal/factory-resource-channel.js +77 -0
- package/dist/internal/filesystem/errors.d.ts +64 -0
- package/dist/internal/filesystem/errors.d.ts.map +1 -0
- package/dist/internal/filesystem/errors.js +175 -0
- package/dist/internal/filesystem/format.d.ts +28 -0
- package/dist/internal/filesystem/format.d.ts.map +1 -0
- package/dist/internal/filesystem/format.js +213 -0
- package/dist/internal/filesystem/merge.d.ts +34 -0
- package/dist/internal/filesystem/merge.d.ts.map +1 -0
- package/dist/internal/filesystem/merge.js +196 -0
- package/dist/internal/filesystem/scratch.d.ts +59 -0
- package/dist/internal/filesystem/scratch.d.ts.map +1 -0
- package/dist/internal/filesystem/scratch.js +212 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts +29 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -0
- package/dist/internal/filesystem/sdk-schemas.js +153 -0
- package/dist/internal/filesystem/tools.d.ts +42 -0
- package/dist/internal/filesystem/tools.d.ts.map +1 -0
- package/dist/internal/filesystem/tools.js +618 -0
- package/dist/internal/filesystem/walk.d.ts +74 -0
- package/dist/internal/filesystem/walk.d.ts.map +1 -0
- package/dist/internal/filesystem/walk.js +339 -0
- package/dist/internal/framework-file-storage.d.ts +3 -1
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +3 -1
- package/dist/internal/guest-network.d.ts +5 -2
- package/dist/internal/guest-network.d.ts.map +1 -1
- package/dist/internal/guest-network.js +7 -2
- package/dist/internal/hosted-delivery.d.ts +7 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +41 -3
- package/dist/internal/hosted-managed-automation.d.ts.map +1 -1
- package/dist/internal/hosted-managed-automation.js +27 -2
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -1
- package/dist/internal/sdk-runner.d.ts +13 -1
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +21 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +11 -3
- package/dist/internal/session-engine.d.ts +30 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +484 -82
- package/dist/internal/store-mirror.d.ts +2 -2
- package/dist/internal/store-mirror.js +2 -2
- package/dist/internal/tenant-slack/relay.d.ts +2 -0
- package/dist/internal/tenant-slack/relay.d.ts.map +1 -1
- package/dist/internal/tenant-slack/relay.js +18 -8
- package/dist/internal/testing/factory-resource-fixtures.d.ts +48 -0
- package/dist/internal/testing/factory-resource-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/factory-resource-fixtures.js +41 -0
- package/dist/internal/workspace-sync.d.ts +31 -6
- package/dist/internal/workspace-sync.d.ts.map +1 -1
- package/dist/internal/workspace-sync.js +67 -12
- package/dist/internal/workspace.d.ts +9 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +16 -0
- package/dist/playground/assets/{index-59KvgREd.js → index-BaQzjaNK.js} +40 -40
- package/dist/playground/assets/index-CceqnLTX.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +60 -11
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +6 -1
- package/docs/design/filesystem.md +376 -0
- package/docs/guides/github.md +5 -0
- package/docs/guides/grokbot-agents.md +93 -0
- package/docs/reference/channels.md +20 -0
- package/docs/reference/cli.md +2 -1
- package/docs/reference/extensions.md +2 -0
- package/docs/templates/grokbot-agents.md +53 -0
- package/package.json +25 -2
- package/src/channels/change-monitors/change-monitors-channel.ts +62 -0
- package/src/channels/change-monitors/index.ts +8 -0
- package/src/channels/change-monitors/types.ts +44 -0
- package/src/channels/deployments/deployments-channel.ts +1 -0
- package/src/channels/deployments/types.ts +2 -0
- package/src/channels/github/defaults.ts +4 -0
- package/src/channels/github/progress.ts +76 -10
- package/src/channels/issues/index.ts +9 -0
- package/src/channels/issues/issues-channel.ts +51 -0
- package/src/channels/issues/types.ts +41 -0
- package/src/files.ts +9 -2
- package/src/filesystem.ts +2074 -0
- package/src/index.ts +28 -0
- package/src/internal/continuation-channel.ts +29 -12
- package/src/internal/continuation-identity.ts +122 -37
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/discovery/agent.ts +87 -1
- package/src/internal/discovery/info.ts +3 -0
- package/src/internal/factory-resource-channel.ts +122 -0
- package/src/internal/filesystem/errors.ts +220 -0
- package/src/internal/filesystem/format.ts +276 -0
- package/src/internal/filesystem/merge.ts +195 -0
- package/src/internal/filesystem/scratch.ts +255 -0
- package/src/internal/filesystem/sdk-schemas.ts +204 -0
- package/src/internal/filesystem/tools.ts +821 -0
- package/src/internal/filesystem/walk.ts +369 -0
- package/src/internal/framework-file-storage.ts +3 -1
- package/src/internal/guest-network.ts +8 -2
- package/src/internal/hosted-delivery.ts +71 -2
- package/src/internal/hosted-managed-automation.ts +49 -5
- package/src/internal/init-project.ts +4 -1
- package/src/internal/sdk-runner.ts +23 -0
- package/src/internal/server.ts +16 -0
- package/src/internal/session-engine.ts +595 -73
- package/src/internal/store-mirror.ts +2 -2
- package/src/internal/tenant-slack/relay.ts +28 -4
- package/src/internal/testing/factory-resource-fixtures.ts +85 -0
- package/src/internal/workspace-sync.ts +84 -12
- package/src/internal/workspace.ts +20 -0
- package/src/types.ts +58 -11
- package/templates/grokbot-agents/README.md +26 -0
- package/templates/grokbot-agents/agent/agent.ts +6 -0
- package/templates/grokbot-agents/agent/extensions/grokbot.ts +5 -0
- package/templates/grokbot-agents/agent/instructions.md +7 -0
- package/templates/grokbot-agents/evals/evals.config.ts +5 -0
- package/templates/grokbot-agents/evals/grokbot-agents.eval.ts +18 -0
- package/templates/grokbot-agents/init.json +18 -0
- package/templates/grokbot-agents/package.json +17 -0
- package/templates/grokbot-agents/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +0 -1
- package/dist/docs/assets/index.md.D75GWhPl.js +0 -5
- package/dist/docs/assets/index.md.D75GWhPl.lean.js +0 -1
- package/dist/playground/assets/index-MbMxXg-y.css +0 -1
- /package/dist/docs/assets/{reference_cli.md.CJNc_xYK.lean.js → reference_cli.md.C6Lo8SEd.lean.js} +0 -0
- /package/dist/docs/assets/{reference_extensions.md.DykHW3qL.lean.js → reference_extensions.md.CGmMLblt.lean.js} +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createFactoryResourceChannel } from "../../internal/factory-resource-channel.js";
|
|
3
|
+
import type { ChannelDefinition } from "../../types.js";
|
|
4
|
+
import {
|
|
5
|
+
CHECKPOINT_CREATED_EVENT_TYPE,
|
|
6
|
+
type ChangeMonitorsChannelOptions,
|
|
7
|
+
type CheckpointCreatedEvent,
|
|
8
|
+
} from "./types.js";
|
|
9
|
+
|
|
10
|
+
const checkpointResourceSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
name: z.string().min(1),
|
|
13
|
+
deployment: z.string().min(1),
|
|
14
|
+
runKey: z.string().min(1),
|
|
15
|
+
evidenceSummary: z.string().min(1),
|
|
16
|
+
planRevision: z.string().optional(),
|
|
17
|
+
createTime: z.string().min(1).optional(),
|
|
18
|
+
description: z.string().optional(),
|
|
19
|
+
clear: z.object({}).passthrough().optional(),
|
|
20
|
+
issues: z
|
|
21
|
+
.object({ title: z.string().min(1) })
|
|
22
|
+
.passthrough()
|
|
23
|
+
.optional(),
|
|
24
|
+
inconclusive: z.object({}).passthrough().optional(),
|
|
25
|
+
})
|
|
26
|
+
.passthrough()
|
|
27
|
+
.refine(
|
|
28
|
+
(checkpoint) =>
|
|
29
|
+
[checkpoint.clear, checkpoint.issues, checkpoint.inconclusive].filter(
|
|
30
|
+
(arm) => arm !== undefined
|
|
31
|
+
).length === 1,
|
|
32
|
+
{ message: "checkpoint must have exactly one result arm" }
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const checkpointCreatedEventSchema: z.ZodType<CheckpointCreatedEvent> =
|
|
36
|
+
z.object({
|
|
37
|
+
eventId: z.string().min(1),
|
|
38
|
+
eventType: z.literal(CHECKPOINT_CREATED_EVENT_TYPE),
|
|
39
|
+
teamId: z.string().min(1),
|
|
40
|
+
occurredAtMs: z.number().int().nonnegative(),
|
|
41
|
+
checkpoint: checkpointResourceSchema,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const pack = createFactoryResourceChannel({
|
|
45
|
+
kind: "change_monitors",
|
|
46
|
+
eventTypes: [CHECKPOINT_CREATED_EVENT_TYPE],
|
|
47
|
+
eventSchema: checkpointCreatedEventSchema,
|
|
48
|
+
replayDescription: "Replay a Change Monitor checkpoint-created event.",
|
|
49
|
+
invalidError: "invalid change-monitor checkpoint event",
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
export function changeMonitorsChannel(
|
|
53
|
+
options: ChangeMonitorsChannelOptions
|
|
54
|
+
): ChannelDefinition {
|
|
55
|
+
return pack.channel(options);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function getChangeMonitorsChannelOptions(
|
|
59
|
+
definition: object
|
|
60
|
+
): ChangeMonitorsChannelOptions | undefined {
|
|
61
|
+
return pack.getOptions(definition);
|
|
62
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { changeMonitorsChannel } from "./change-monitors-channel.js";
|
|
2
|
+
export type {
|
|
3
|
+
ChangeMonitorsChannelOptions,
|
|
4
|
+
CheckpointCreatedEvent,
|
|
5
|
+
CheckpointCreatedEventType,
|
|
6
|
+
CheckpointResource,
|
|
7
|
+
} from "./types.js";
|
|
8
|
+
export { CHECKPOINT_CREATED_EVENT_TYPE } from "./types.js";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
|
|
2
|
+
import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
|
|
3
|
+
|
|
4
|
+
export const CHECKPOINT_CREATED_EVENT_TYPE = "checkpoint.created" as const;
|
|
5
|
+
|
|
6
|
+
export type CheckpointCreatedEventType = typeof CHECKPOINT_CREATED_EVENT_TYPE;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Factory Checkpoint JSON (camelCase proto JSON). Exactly one result arm is
|
|
10
|
+
* set: `clear`, `issues`, or `inconclusive`. The channel does not pre-filter.
|
|
11
|
+
*/
|
|
12
|
+
export type CheckpointResource = {
|
|
13
|
+
name: string;
|
|
14
|
+
deployment: string;
|
|
15
|
+
runKey: string;
|
|
16
|
+
evidenceSummary: string;
|
|
17
|
+
planRevision?: string;
|
|
18
|
+
createTime?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
clear?: Record<string, unknown>;
|
|
21
|
+
issues?: { title: string };
|
|
22
|
+
inconclusive?: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Factory `checkpoint.created` for every Change Monitor Checkpoint create. */
|
|
26
|
+
export type CheckpointCreatedEvent = {
|
|
27
|
+
eventId: string;
|
|
28
|
+
eventType: CheckpointCreatedEventType;
|
|
29
|
+
teamId: string;
|
|
30
|
+
occurredAtMs: number;
|
|
31
|
+
checkpoint: CheckpointResource;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type ChangeMonitorsChannelOptions = {
|
|
35
|
+
onEvent: (
|
|
36
|
+
event: CheckpointCreatedEvent,
|
|
37
|
+
args: ChannelHandlerArgs
|
|
38
|
+
) => Promise<unknown> | unknown;
|
|
39
|
+
continuation?: ContinuationIdentity;
|
|
40
|
+
path?: string;
|
|
41
|
+
auth?: ChannelDefinition["auth"];
|
|
42
|
+
onStart?: ChannelDefinition["onStart"];
|
|
43
|
+
onStop?: ChannelDefinition["onStop"];
|
|
44
|
+
};
|
|
@@ -25,6 +25,7 @@ const deploymentEventSchema = z.object({
|
|
|
25
25
|
environment: z.string().min(1),
|
|
26
26
|
service: z.string().min(1).optional(),
|
|
27
27
|
deployVersion: z.string().min(1),
|
|
28
|
+
previousVersion: z.string().min(1).optional(),
|
|
28
29
|
status: z.enum(["pending", "in_progress", "success", "failed"]),
|
|
29
30
|
occurredAtMs: z.number(),
|
|
30
31
|
});
|
|
@@ -28,6 +28,8 @@ export interface DeploymentEvent {
|
|
|
28
28
|
/** Absent when the deployment records no service. */
|
|
29
29
|
service?: string;
|
|
30
30
|
deployVersion: string;
|
|
31
|
+
/** Last succeeded different SHA; omitted on the first ship. */
|
|
32
|
+
previousVersion?: string;
|
|
31
33
|
status: DeploymentStatus;
|
|
32
34
|
occurredAtMs: number;
|
|
33
35
|
}
|
|
@@ -41,6 +41,7 @@ export function buildDefaultGitHubEvents(
|
|
|
41
41
|
}
|
|
42
42
|
await applyGitHubProgress({
|
|
43
43
|
phase: "pending",
|
|
44
|
+
sessionId: event.sessionId,
|
|
44
45
|
channel,
|
|
45
46
|
options,
|
|
46
47
|
});
|
|
@@ -86,6 +87,7 @@ export function buildDefaultGitHubEvents(
|
|
|
86
87
|
toolOutcomesBySession.delete(event.sessionId);
|
|
87
88
|
await applyGitHubProgress({
|
|
88
89
|
phase: pipelineSucceeded ? "success" : "failure",
|
|
90
|
+
sessionId: event.sessionId,
|
|
89
91
|
channel,
|
|
90
92
|
options,
|
|
91
93
|
});
|
|
@@ -116,6 +118,7 @@ export function buildDefaultGitHubEvents(
|
|
|
116
118
|
toolOutcomesBySession.delete(event.sessionId);
|
|
117
119
|
await applyGitHubProgress({
|
|
118
120
|
phase: "failure",
|
|
121
|
+
sessionId: event.sessionId,
|
|
119
122
|
channel,
|
|
120
123
|
options,
|
|
121
124
|
});
|
|
@@ -126,6 +129,7 @@ export function buildDefaultGitHubEvents(
|
|
|
126
129
|
toolOutcomesBySession.delete(event.sessionId);
|
|
127
130
|
await applyGitHubProgress({
|
|
128
131
|
phase: "failure",
|
|
132
|
+
sessionId: event.sessionId,
|
|
129
133
|
channel,
|
|
130
134
|
options,
|
|
131
135
|
});
|
|
@@ -28,6 +28,27 @@ export interface GitHubProgressPhaseCopy {
|
|
|
28
28
|
export interface GitHubCommitStatusProgress extends GitHubProgressPhaseCopy {
|
|
29
29
|
/** Check run name (unique per check in the merge box). */
|
|
30
30
|
context: string;
|
|
31
|
+
/**
|
|
32
|
+
* Check Details URL for this session. When it resolves, it is written as
|
|
33
|
+
* `details_url` and (with {@link summaryLinkText}) appended to the summary.
|
|
34
|
+
*/
|
|
35
|
+
detailsUrl?: (sessionId: string) => string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* `output.title` source. `"phase"` (default) uses the pending/success/
|
|
38
|
+
* failure copy. `"context"` uses the check name — the dashboard automation
|
|
39
|
+
* shape (`Cursor Security Agent: …`).
|
|
40
|
+
*/
|
|
41
|
+
outputTitle?: "phase" | "context";
|
|
42
|
+
/**
|
|
43
|
+
* Markdown link label appended to the summary when {@link detailsUrl}
|
|
44
|
+
* resolves, e.g. `"View agent"`.
|
|
45
|
+
*/
|
|
46
|
+
summaryLinkText?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Conclusion for the failure phase. Default `"failure"`. Use `"neutral"`
|
|
49
|
+
* when a red merge-box check must not gate merge (findings live on the PR).
|
|
50
|
+
*/
|
|
51
|
+
failureConclusion?: "failure" | "neutral";
|
|
31
52
|
}
|
|
32
53
|
|
|
33
54
|
export type GitHubBannerProgress = GitHubProgressPhaseCopy;
|
|
@@ -125,6 +146,7 @@ function progressLabel(
|
|
|
125
146
|
*/
|
|
126
147
|
export async function applyGitHubProgress(input: {
|
|
127
148
|
phase: GitHubProgressPhase;
|
|
149
|
+
sessionId?: string;
|
|
128
150
|
channel: { state: GitHubChannelState };
|
|
129
151
|
options: GitHubProgressOptions;
|
|
130
152
|
}): Promise<void> {
|
|
@@ -139,6 +161,7 @@ export async function applyGitHubProgress(input: {
|
|
|
139
161
|
tasks.push(
|
|
140
162
|
postProgressCheckRun({
|
|
141
163
|
phase: input.phase,
|
|
164
|
+
sessionId: input.sessionId,
|
|
142
165
|
channel: input.channel,
|
|
143
166
|
options: input.options,
|
|
144
167
|
commitStatus,
|
|
@@ -159,8 +182,35 @@ export async function applyGitHubProgress(input: {
|
|
|
159
182
|
await Promise.all(tasks);
|
|
160
183
|
}
|
|
161
184
|
|
|
185
|
+
function resolveProgressDetailsUrl(input: {
|
|
186
|
+
sessionId: string | undefined;
|
|
187
|
+
commitStatus: GitHubCommitStatusProgress;
|
|
188
|
+
}): string | undefined {
|
|
189
|
+
if (
|
|
190
|
+
input.sessionId === undefined ||
|
|
191
|
+
input.commitStatus.detailsUrl === undefined
|
|
192
|
+
) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
const url = input.commitStatus.detailsUrl(input.sessionId)?.trim();
|
|
196
|
+
return url === "" ? undefined : url;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function appendSummaryLink(
|
|
200
|
+
summary: string,
|
|
201
|
+
detailsUrl?: string,
|
|
202
|
+
linkText?: string
|
|
203
|
+
): string {
|
|
204
|
+
const label = linkText?.trim();
|
|
205
|
+
if (detailsUrl === undefined || label === undefined || label === "") {
|
|
206
|
+
return summary;
|
|
207
|
+
}
|
|
208
|
+
return `${summary}\n\n[${label}](${detailsUrl})`;
|
|
209
|
+
}
|
|
210
|
+
|
|
162
211
|
async function postProgressCheckRun(input: {
|
|
163
212
|
phase: GitHubProgressPhase;
|
|
213
|
+
sessionId?: string;
|
|
164
214
|
channel: { state: GitHubChannelState };
|
|
165
215
|
options: GitHubProgressOptions;
|
|
166
216
|
commitStatus: GitHubCommitStatusProgress;
|
|
@@ -175,17 +225,32 @@ async function postProgressCheckRun(input: {
|
|
|
175
225
|
return;
|
|
176
226
|
}
|
|
177
227
|
const sha = state.headSha;
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
228
|
+
const phaseCopy = progressPhaseCopy({
|
|
229
|
+
copy: input.commitStatus,
|
|
230
|
+
phase: input.phase,
|
|
231
|
+
label: progressLabel(input.options, input.commitStatus.context),
|
|
232
|
+
});
|
|
233
|
+
const title = clipStatusDescription(
|
|
234
|
+
input.commitStatus.outputTitle === "context"
|
|
235
|
+
? input.commitStatus.context
|
|
236
|
+
: phaseCopy
|
|
184
237
|
);
|
|
238
|
+
const detailsUrl = resolveProgressDetailsUrl({
|
|
239
|
+
sessionId: input.sessionId,
|
|
240
|
+
commitStatus: input.commitStatus,
|
|
241
|
+
});
|
|
185
242
|
const write: GitHubCheckRunWriteInput = {
|
|
186
243
|
name: input.commitStatus.context,
|
|
187
|
-
...checkRunPhaseFields(input.phase),
|
|
188
|
-
|
|
244
|
+
...checkRunPhaseFields(input.phase, input.commitStatus.failureConclusion),
|
|
245
|
+
...(detailsUrl === undefined ? {} : { detailsUrl }),
|
|
246
|
+
output: {
|
|
247
|
+
title,
|
|
248
|
+
summary: appendSummaryLink(
|
|
249
|
+
phaseCopy,
|
|
250
|
+
detailsUrl,
|
|
251
|
+
input.commitStatus.summaryLinkText
|
|
252
|
+
),
|
|
253
|
+
},
|
|
189
254
|
};
|
|
190
255
|
const resource = {
|
|
191
256
|
api: input.options.api,
|
|
@@ -249,14 +314,15 @@ function shouldRecreateCheckRun(
|
|
|
249
314
|
}
|
|
250
315
|
|
|
251
316
|
function checkRunPhaseFields(
|
|
252
|
-
phase: GitHubProgressPhase
|
|
317
|
+
phase: GitHubProgressPhase,
|
|
318
|
+
failureConclusion: "failure" | "neutral" = "failure"
|
|
253
319
|
): Pick<GitHubCheckRunWriteInput, "conclusion" | "status"> {
|
|
254
320
|
if (phase === "pending") {
|
|
255
321
|
return { status: "in_progress" };
|
|
256
322
|
}
|
|
257
323
|
return {
|
|
258
324
|
status: "completed",
|
|
259
|
-
conclusion: phase === "success" ? "success" :
|
|
325
|
+
conclusion: phase === "success" ? "success" : failureConclusion,
|
|
260
326
|
};
|
|
261
327
|
}
|
|
262
328
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createFactoryResourceChannel } from "../../internal/factory-resource-channel.js";
|
|
3
|
+
import type { ChannelDefinition } from "../../types.js";
|
|
4
|
+
import {
|
|
5
|
+
ISSUE_CREATED_EVENT_TYPE,
|
|
6
|
+
type IssueCreatedEvent,
|
|
7
|
+
type IssuesChannelOptions,
|
|
8
|
+
} from "./types.js";
|
|
9
|
+
|
|
10
|
+
const issueResourceSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
name: z.string().min(1),
|
|
13
|
+
title: z.string().min(1),
|
|
14
|
+
body: z.string().min(1),
|
|
15
|
+
state: z
|
|
16
|
+
.enum(["STATE_UNSPECIFIED", "STATE_OPEN", "STATE_CLOSED"])
|
|
17
|
+
.optional(),
|
|
18
|
+
createTime: z.string().min(1).optional(),
|
|
19
|
+
updateTime: z.string().min(1).optional(),
|
|
20
|
+
path: z.string().optional(),
|
|
21
|
+
etag: z.string().optional(),
|
|
22
|
+
})
|
|
23
|
+
.passthrough();
|
|
24
|
+
|
|
25
|
+
const issueCreatedEventSchema: z.ZodType<IssueCreatedEvent> = z.object({
|
|
26
|
+
eventId: z.string().min(1),
|
|
27
|
+
eventType: z.literal(ISSUE_CREATED_EVENT_TYPE),
|
|
28
|
+
teamId: z.string().min(1),
|
|
29
|
+
occurredAtMs: z.number().int().nonnegative(),
|
|
30
|
+
issue: issueResourceSchema,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const pack = createFactoryResourceChannel({
|
|
34
|
+
kind: "issues",
|
|
35
|
+
eventTypes: [ISSUE_CREATED_EVENT_TYPE],
|
|
36
|
+
eventSchema: issueCreatedEventSchema,
|
|
37
|
+
replayDescription: "Replay a Factory issue-created event.",
|
|
38
|
+
invalidError: "invalid issue event",
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export function issuesChannel(
|
|
42
|
+
options: IssuesChannelOptions
|
|
43
|
+
): ChannelDefinition {
|
|
44
|
+
return pack.channel(options);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function getIssuesChannelOptions(
|
|
48
|
+
definition: object
|
|
49
|
+
): IssuesChannelOptions | undefined {
|
|
50
|
+
return pack.getOptions(definition);
|
|
51
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
|
|
2
|
+
import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
|
|
3
|
+
|
|
4
|
+
export const ISSUE_CREATED_EVENT_TYPE = "issue.created" as const;
|
|
5
|
+
|
|
6
|
+
export type IssueCreatedEventType = typeof ISSUE_CREATED_EVENT_TYPE;
|
|
7
|
+
|
|
8
|
+
export type IssueState = "STATE_UNSPECIFIED" | "STATE_OPEN" | "STATE_CLOSED";
|
|
9
|
+
|
|
10
|
+
/** Factory Issue JSON (camelCase proto JSON). */
|
|
11
|
+
export type IssueResource = {
|
|
12
|
+
name: string;
|
|
13
|
+
title: string;
|
|
14
|
+
body: string;
|
|
15
|
+
state?: IssueState;
|
|
16
|
+
createTime?: string;
|
|
17
|
+
updateTime?: string;
|
|
18
|
+
path?: string;
|
|
19
|
+
etag?: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Factory `issue.created` for every Issue create. */
|
|
23
|
+
export type IssueCreatedEvent = {
|
|
24
|
+
eventId: string;
|
|
25
|
+
eventType: IssueCreatedEventType;
|
|
26
|
+
teamId: string;
|
|
27
|
+
occurredAtMs: number;
|
|
28
|
+
issue: IssueResource;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type IssuesChannelOptions = {
|
|
32
|
+
onEvent: (
|
|
33
|
+
event: IssueCreatedEvent,
|
|
34
|
+
args: ChannelHandlerArgs
|
|
35
|
+
) => Promise<unknown> | unknown;
|
|
36
|
+
continuation?: ContinuationIdentity;
|
|
37
|
+
path?: string;
|
|
38
|
+
auth?: ChannelDefinition["auth"];
|
|
39
|
+
onStart?: ChannelDefinition["onStart"];
|
|
40
|
+
onStop?: ChannelDefinition["onStop"];
|
|
41
|
+
};
|
package/src/files.ts
CHANGED
|
@@ -163,8 +163,10 @@ export const AGENT_SERVE_USER_STORE_KEY_PREFIX = "agent-serve";
|
|
|
163
163
|
* Skills sit at store-root `skills/<name>/…` so exec-daemon's
|
|
164
164
|
* `--agent-store-skills-dir` walk finds them the same way it finds user-store
|
|
165
165
|
* skills. Workspace seeds sit at store-root `workspace/…` so the mount path
|
|
166
|
-
* the first cloud prompt names stays short.
|
|
167
|
-
*
|
|
166
|
+
* the first cloud prompt names stays short. Per-turn `workspaceFiles` sit at
|
|
167
|
+
* `sessions/<sessionId>/workspace/…` on that same shared mount (replace on
|
|
168
|
+
* later sends; wipe when a task session ends). Memory and artifacts stay
|
|
169
|
+
* under {@link STORAGE_KEY_ROOT}.
|
|
168
170
|
*/
|
|
169
171
|
function createAgentStoreKeys(root: string) {
|
|
170
172
|
return {
|
|
@@ -191,6 +193,11 @@ function createAgentStoreKeys(root: string) {
|
|
|
191
193
|
/** Personal-key cloud agents: namespaced like {@link userSkillsPrefix}. */
|
|
192
194
|
userWorkspacePrefix: (agent: string): string =>
|
|
193
195
|
`${AGENT_SERVE_USER_STORE_KEY_PREFIX}/${agent}/workspace/`,
|
|
196
|
+
sessionWorkspacePrefix: (sessionId: string): string =>
|
|
197
|
+
`sessions/${sessionId}/workspace/`,
|
|
198
|
+
/** Personal-key cloud agents: namespaced like {@link sessionWorkspacePrefix}. */
|
|
199
|
+
userSessionWorkspacePrefix: (agent: string, sessionId: string): string =>
|
|
200
|
+
`${AGENT_SERVE_USER_STORE_KEY_PREFIX}/${agent}/sessions/${sessionId}/workspace/`,
|
|
194
201
|
memoryDir: (agent: string): string => `${root}/${agent}/memory`,
|
|
195
202
|
memoryJournal: (agent: string): string =>
|
|
196
203
|
`${root}/${agent}/memory/journal.jsonl`,
|