@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
|
@@ -91,6 +91,9 @@ export class ReminderRunner {
|
|
|
91
91
|
if (this.started)
|
|
92
92
|
return;
|
|
93
93
|
this.started = true;
|
|
94
|
+
// Materialize sink-backed reminders onto local disk before arming
|
|
95
|
+
// (local wins when both sides have the same id).
|
|
96
|
+
yield this.hydrateFromStorage();
|
|
94
97
|
const armed = yield this.store.listArmed();
|
|
95
98
|
let restored = 0;
|
|
96
99
|
let disarmedOrphan = 0;
|
|
@@ -114,6 +117,47 @@ export class ReminderRunner {
|
|
|
114
117
|
}
|
|
115
118
|
});
|
|
116
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Pull reminder records from `defineStorage` into `<stateRoot>/reminders`
|
|
122
|
+
* when local disk is empty for that id. Failures are logged and skipped.
|
|
123
|
+
*/
|
|
124
|
+
hydrateFromStorage() {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const storage = this.engine.storage;
|
|
127
|
+
if (storage === undefined || !storage.canBulkRestore) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let hydrated = 0;
|
|
131
|
+
try {
|
|
132
|
+
const remote = yield storage.listReminders();
|
|
133
|
+
for (const record of remote) {
|
|
134
|
+
const local = yield this.store.get(record.id);
|
|
135
|
+
if (local !== undefined) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Local write only — re-mirroring would just echo the sink.
|
|
139
|
+
yield this.store.save(record);
|
|
140
|
+
hydrated += 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
145
|
+
this.logger(`[agent-serve] reminders: storage hydrate failed: ${message}`);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (hydrated > 0) {
|
|
149
|
+
this.logger(`[agent-serve] reminders: hydrated ${hydrated} reminder(s) from storage`);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Persist locally and mirror into the authored storage sink when present. */
|
|
154
|
+
persist(record) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
var _a;
|
|
157
|
+
yield this.store.save(record);
|
|
158
|
+
(_a = this.engine.storage) === null || _a === void 0 ? void 0 : _a.reminder(record);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
117
161
|
stop() {
|
|
118
162
|
this.started = false;
|
|
119
163
|
for (const timer of this.timers.values()) {
|
|
@@ -168,7 +212,7 @@ export class ReminderRunner {
|
|
|
168
212
|
createdAt: now,
|
|
169
213
|
updatedAt: now,
|
|
170
214
|
};
|
|
171
|
-
yield this.
|
|
215
|
+
yield this.persist(record);
|
|
172
216
|
this.handlers.set(id, {
|
|
173
217
|
run: input.run,
|
|
174
218
|
untilFn,
|
|
@@ -216,7 +260,7 @@ export class ReminderRunner {
|
|
|
216
260
|
}
|
|
217
261
|
this.clearTimer(id);
|
|
218
262
|
const updated = Object.assign(Object.assign({}, record), { status: "cancelled", disarmReason: reason, updatedAt: new Date().toISOString() });
|
|
219
|
-
yield this.
|
|
263
|
+
yield this.persist(updated);
|
|
220
264
|
this.handlers.delete(id);
|
|
221
265
|
return toInfo(updated);
|
|
222
266
|
});
|
|
@@ -518,7 +562,7 @@ export class ReminderRunner {
|
|
|
518
562
|
return __awaiter(this, void 0, void 0, function* () {
|
|
519
563
|
this.clearTimer(record.id);
|
|
520
564
|
const updated = Object.assign(Object.assign({}, record), { status: "disarmed", disarmReason: reason, updatedAt: new Date().toISOString() });
|
|
521
|
-
yield this.
|
|
565
|
+
yield this.persist(updated);
|
|
522
566
|
this.handlers.delete(record.id);
|
|
523
567
|
});
|
|
524
568
|
}
|
|
@@ -552,14 +596,14 @@ export class ReminderRunner {
|
|
|
552
596
|
scheduleKind: reschedule.delay !== undefined ? "delay" : "at", scheduleValue: reschedule.delay !== undefined
|
|
553
597
|
? String(reschedule.delay)
|
|
554
598
|
: String(reschedule.at), updatedAt: new Date().toISOString() });
|
|
555
|
-
yield this.
|
|
599
|
+
yield this.persist(updated);
|
|
556
600
|
this.armTimer(updated);
|
|
557
601
|
return;
|
|
558
602
|
}
|
|
559
603
|
if (oneShot) {
|
|
560
604
|
this.clearTimer(current.id);
|
|
561
605
|
const updated = Object.assign(Object.assign({}, current), { fireCount: current.fireCount + 1, status: "completed", disarmReason: "one_shot_complete", updatedAt: new Date().toISOString() });
|
|
562
|
-
yield this.
|
|
606
|
+
yield this.persist(updated);
|
|
563
607
|
this.handlers.delete(current.id);
|
|
564
608
|
return;
|
|
565
609
|
}
|
|
@@ -575,7 +619,7 @@ export class ReminderRunner {
|
|
|
575
619
|
throw new Error(`Reminder "${current.id}" has recurring status with scheduleKind=${current.scheduleKind}`);
|
|
576
620
|
}
|
|
577
621
|
const updated = Object.assign(Object.assign({}, current), { fireCount: current.fireCount + 1, nextFireAtMs, updatedAt: new Date().toISOString() });
|
|
578
|
-
yield this.
|
|
622
|
+
yield this.persist(updated);
|
|
579
623
|
this.armTimer(updated);
|
|
580
624
|
});
|
|
581
625
|
}
|
|
@@ -44,6 +44,8 @@ export interface ReminderRecord {
|
|
|
44
44
|
createdAt: string;
|
|
45
45
|
updatedAt: string;
|
|
46
46
|
}
|
|
47
|
+
/** Narrow a sink value to a {@link ReminderRecord} (startup hydrate). */
|
|
48
|
+
export declare function isReminderRecord(value: unknown): value is ReminderRecord;
|
|
47
49
|
export declare class ReminderStore {
|
|
48
50
|
private readonly rootDir;
|
|
49
51
|
constructor(rootDir: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reminder-store.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,yBAAyB,EAAG,CAAU,CAAC;AAEpD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,yBAAyB,CAAC;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,oBAAoB,CAAC;IACnC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,MAAM,EAAI;IAEhD,OAAO,CAAC,QAAQ;IAIV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAEK,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAiBtC;IAEK,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAG3C;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAsBzD;IAEK,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhD;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtC;CACF"}
|
|
1
|
+
{"version":3,"file":"reminder-store.d.ts","sourceRoot":"","sources":["../../src/internal/reminder-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,yBAAyB,EAAG,CAAU,CAAC;AAEpD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,yBAAyB,CAAC;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,oBAAoB,CAAC;IACnC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAkBxE;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,MAAM,EAAI;IAEhD,OAAO,CAAC,QAAQ;IAIV,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAEK,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAiBtC;IAEK,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAG3C;IAEK,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAsBzD;IAEK,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhD;IAEK,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtC;CACF"}
|
|
@@ -18,6 +18,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
18
18
|
import { mkdir, readdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
export const REMINDER_SNAPSHOT_VERSION = 1;
|
|
21
|
+
/** Narrow a sink value to a {@link ReminderRecord} (startup hydrate). */
|
|
22
|
+
export function isReminderRecord(value) {
|
|
23
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const record = value;
|
|
27
|
+
return (record.version === REMINDER_SNAPSHOT_VERSION &&
|
|
28
|
+
typeof record.id === "string" &&
|
|
29
|
+
record.id !== "" &&
|
|
30
|
+
typeof record.purpose === "string" &&
|
|
31
|
+
typeof record.channelId === "string" &&
|
|
32
|
+
typeof record.continuationToken === "string" &&
|
|
33
|
+
typeof record.scheduleKind === "string" &&
|
|
34
|
+
typeof record.scheduleValue === "string" &&
|
|
35
|
+
typeof record.status === "string" &&
|
|
36
|
+
typeof record.nextFireAtMs === "number" &&
|
|
37
|
+
Number.isFinite(record.nextFireAtMs));
|
|
38
|
+
}
|
|
21
39
|
export class ReminderStore {
|
|
22
40
|
constructor(rootDir) {
|
|
23
41
|
this.rootDir = rootDir;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Authorization bearer + arbitrary request headers for agent HTTP
|
|
3
|
+
* clients (local `--bearer-token`, hosted `engineAccess.headers`, etc.).
|
|
4
|
+
*/
|
|
5
|
+
export interface RequestAuth {
|
|
6
|
+
bearerToken?: string;
|
|
7
|
+
/** Extra headers (e.g. X-Anyrun-Port-Token from engineAccess). */
|
|
8
|
+
headers?: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export declare function mergeRequestHeaders(auth: RequestAuth | undefined): Record<string, string>;
|
|
11
|
+
//# sourceMappingURL=request-headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../src/internal/request-headers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Authorization bearer + arbitrary request headers for agent HTTP
|
|
3
|
+
* clients (local `--bearer-token`, hosted `engineAccess.headers`, etc.).
|
|
4
|
+
*/
|
|
5
|
+
export function mergeRequestHeaders(auth) {
|
|
6
|
+
const out = {};
|
|
7
|
+
if ((auth === null || auth === void 0 ? void 0 : auth.headers) !== undefined) {
|
|
8
|
+
Object.assign(out, auth.headers);
|
|
9
|
+
}
|
|
10
|
+
if ((auth === null || auth === void 0 ? void 0 : auth.bearerToken) !== undefined) {
|
|
11
|
+
out.authorization = `Bearer ${auth.bearerToken}`;
|
|
12
|
+
}
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a hosted (managed) agent-serve deployment into a base URL +
|
|
3
|
+
* request headers for chat/run/call/eval `--prod`.
|
|
4
|
+
*
|
|
5
|
+
* Uses short-lived `engineAccess` from the deployment status route
|
|
6
|
+
* (Cursor API key on the management API; `X-Anyrun-Port-Token` on the
|
|
7
|
+
* engine). Alias tokens are out of scope here.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Interactive CLI keep-alive for hosted engines. Without these, a hibernated
|
|
11
|
+
* Anyrun pod returns 417 `pod_hibernated` and never wakes. Matches the
|
|
12
|
+
* cloud-agent interactive keep-alive shape (lower ≤ upper, seconds).
|
|
13
|
+
*/
|
|
14
|
+
export declare const PROD_ENGINE_WAKE_HEADERS: Readonly<Record<string, string>>;
|
|
15
|
+
export interface ResolveProdTargetOptions {
|
|
16
|
+
dir: string;
|
|
17
|
+
cwd?: string;
|
|
18
|
+
/** Explicit deployment slug; otherwise derived from `--dir` basename. */
|
|
19
|
+
slug?: string;
|
|
20
|
+
team?: string;
|
|
21
|
+
apiKey?: string;
|
|
22
|
+
fetchImpl?: typeof fetch;
|
|
23
|
+
err?: (text: string) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface ResolvedProdTarget {
|
|
26
|
+
agentUrl: string;
|
|
27
|
+
headers: Record<string, string>;
|
|
28
|
+
slug: string;
|
|
29
|
+
expiresAt: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Look up a running deployment and return its engineAccess URL/headers.
|
|
33
|
+
* Throws {@link Error} with a CLI-ready message on failure.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveProdTarget(options: ResolveProdTargetOptions): Promise<ResolvedProdTarget>;
|
|
36
|
+
/** Resolve the deployment slug the same way `deploy` does for a single dir. */
|
|
37
|
+
export declare function resolveProdSlug(options: {
|
|
38
|
+
dir: string;
|
|
39
|
+
cwd?: string;
|
|
40
|
+
slug?: string;
|
|
41
|
+
}): string;
|
|
42
|
+
//# sourceMappingURL=resolve-prod-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-prod-target.d.ts","sourceRoot":"","sources":["../../src/internal/resolve-prod-target.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGrE,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA+D7B;AAWD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAgBT"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a hosted (managed) agent-serve deployment into a base URL +
|
|
3
|
+
* request headers for chat/run/call/eval `--prod`.
|
|
4
|
+
*
|
|
5
|
+
* Uses short-lived `engineAccess` from the deployment status route
|
|
6
|
+
* (Cursor API key on the management API; `X-Anyrun-Port-Token` on the
|
|
7
|
+
* engine). Alias tokens are out of scope here.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { basename, resolve } from "node:path";
|
|
19
|
+
import { resolveDeployAuth } from "./cli-deploy.js";
|
|
20
|
+
import { DeployApiError, slugFromDirectoryName, validateDeploymentSlug, } from "./deploy-client.js";
|
|
21
|
+
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
22
|
+
import { stderrPalette } from "./terminal-style.js";
|
|
23
|
+
/**
|
|
24
|
+
* Interactive CLI keep-alive for hosted engines. Without these, a hibernated
|
|
25
|
+
* Anyrun pod returns 417 `pod_hibernated` and never wakes. Matches the
|
|
26
|
+
* cloud-agent interactive keep-alive shape (lower ≤ upper, seconds).
|
|
27
|
+
*/
|
|
28
|
+
export const PROD_ENGINE_WAKE_HEADERS = {
|
|
29
|
+
"x-anyrun-hibernation-lower-bound-s": "1800",
|
|
30
|
+
"x-anyrun-hibernation-upper-bound-s": "3600",
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Look up a running deployment and return its engineAccess URL/headers.
|
|
34
|
+
* Throws {@link Error} with a CLI-ready message on failure.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveProdTarget(options) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
var _a;
|
|
39
|
+
const err = (_a = options.err) !== null && _a !== void 0 ? _a : ((text) => void process.stderr.write(text));
|
|
40
|
+
const slug = resolveProdSlug(options);
|
|
41
|
+
const auth = yield resolveDeployAuth({
|
|
42
|
+
team: options.team,
|
|
43
|
+
apiKey: options.apiKey,
|
|
44
|
+
fetchImpl: options.fetchImpl,
|
|
45
|
+
err,
|
|
46
|
+
});
|
|
47
|
+
if (typeof auth === "number") {
|
|
48
|
+
throw new Error(`Could not resolve Cursor credentials/team for --prod (see above).`);
|
|
49
|
+
}
|
|
50
|
+
let detail;
|
|
51
|
+
try {
|
|
52
|
+
detail = yield auth.client.getDeployment({
|
|
53
|
+
teamId: auth.teamId,
|
|
54
|
+
slug,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof DeployApiError) {
|
|
59
|
+
throw new Error(`Deployment "${slug}" (team ${auth.teamId}): ${error.message}`);
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
// `degraded` still serves the previous ACTIVE engine; allow runtime access
|
|
64
|
+
// when the control plane minted engineAccess for it.
|
|
65
|
+
const access = detail.engineAccess;
|
|
66
|
+
const statusOk = detail.status === "running" || detail.status === "degraded";
|
|
67
|
+
if (!statusOk) {
|
|
68
|
+
const lastError = detail.lastError === null || detail.lastError === undefined
|
|
69
|
+
? ""
|
|
70
|
+
: ` ${sanitizeCustomerFacingDetail(detail.lastError)}`;
|
|
71
|
+
throw new Error(`Deployment "${slug}" is ${detail.status}, not running.${lastError}\n` +
|
|
72
|
+
`Deploy or wait: \`${CLI} deploy --slug ${slug}\` / \`${CLI} deployment ${slug}\``);
|
|
73
|
+
}
|
|
74
|
+
if (access === null || access === undefined) {
|
|
75
|
+
throw new Error(`Deployment "${slug}" is ${detail.status} but is not reachable yet. ` +
|
|
76
|
+
`Try \`${CLI} deployment ${slug}\` or redeploy.`);
|
|
77
|
+
}
|
|
78
|
+
err(`${stderrPalette().dim(`Using hosted deployment "${slug}".`)}\n`);
|
|
79
|
+
return {
|
|
80
|
+
agentUrl: access.url.replace(/\/$/, ""),
|
|
81
|
+
headers: Object.assign(Object.assign({}, access.headers), PROD_ENGINE_WAKE_HEADERS),
|
|
82
|
+
slug,
|
|
83
|
+
expiresAt: access.expiresAt,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Strip obvious hosting internals from customer-facing error fragments. */
|
|
88
|
+
function sanitizeCustomerFacingDetail(message) {
|
|
89
|
+
return message
|
|
90
|
+
.replace(/https?:\/\/\S+/gi, "[url]")
|
|
91
|
+
.replace(/\bpod-[a-z0-9]+\b/gi, "[runtime]")
|
|
92
|
+
.replace(/\banyrun\b/gi, "runtime")
|
|
93
|
+
.replace(/\bcursorvm\.com\b/gi, "host");
|
|
94
|
+
}
|
|
95
|
+
/** Resolve the deployment slug the same way `deploy` does for a single dir. */
|
|
96
|
+
export function resolveProdSlug(options) {
|
|
97
|
+
var _a;
|
|
98
|
+
if (options.slug !== undefined && options.slug !== "") {
|
|
99
|
+
const slugError = validateDeploymentSlug(options.slug);
|
|
100
|
+
if (slugError !== undefined) {
|
|
101
|
+
throw new Error(slugError);
|
|
102
|
+
}
|
|
103
|
+
return options.slug;
|
|
104
|
+
}
|
|
105
|
+
const dir = resolve((_a = options.cwd) !== null && _a !== void 0 ? _a : process.cwd(), options.dir);
|
|
106
|
+
const derived = slugFromDirectoryName(basename(dir));
|
|
107
|
+
if (derived === undefined) {
|
|
108
|
+
throw new Error(`Could not derive a deployment slug from the directory name ${JSON.stringify(basename(dir))}; pass --slug.`);
|
|
109
|
+
}
|
|
110
|
+
return derived;
|
|
111
|
+
}
|
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
* compact {@link Trajectory} plus the continuation token for follow-ups.
|
|
7
7
|
*/
|
|
8
8
|
import type { SessionEvent, SessionPurpose } from "../types.js";
|
|
9
|
+
import { type RequestAuth } from "./request-headers.js";
|
|
9
10
|
import { type Trajectory } from "./trajectory.js";
|
|
10
11
|
/** Thrown when a turn stream exceeds `timeoutMs`; carries the session id. */
|
|
11
12
|
export declare class RunSessionTimeoutError extends Error {
|
|
12
13
|
readonly sessionId: string;
|
|
13
14
|
constructor(message: string, sessionId: string);
|
|
14
15
|
}
|
|
15
|
-
export interface RunClientOptions {
|
|
16
|
+
export interface RunClientOptions extends RequestAuth {
|
|
16
17
|
baseUrl: string;
|
|
17
|
-
bearerToken?: string;
|
|
18
18
|
/** Abort a hung turn. */
|
|
19
19
|
timeoutMs?: number;
|
|
20
20
|
/** Called for each stream event as it arrives (for CLI progress). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC,GACA,OAAO,CAAC,gBAAgB,CAAC,CAuD3B"}
|
|
@@ -14,6 +14,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
14
14
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
15
|
});
|
|
16
16
|
};
|
|
17
|
+
import { mergeRequestHeaders } from "./request-headers.js";
|
|
17
18
|
import { buildTrajectory } from "./trajectory.js";
|
|
18
19
|
/** Thrown when a turn stream exceeds `timeoutMs`; carries the session id. */
|
|
19
20
|
export class RunSessionTimeoutError extends Error {
|
|
@@ -42,17 +43,24 @@ export function runSession(options) {
|
|
|
42
43
|
let continuationToken = options.continuationToken;
|
|
43
44
|
const allEvents = [];
|
|
44
45
|
let nextEventIndex = 0;
|
|
46
|
+
const auth = {
|
|
47
|
+
bearerToken: options.bearerToken,
|
|
48
|
+
headers: options.headers,
|
|
49
|
+
};
|
|
45
50
|
for (const message of options.messages) {
|
|
46
|
-
const turn = yield runOneTurn(
|
|
51
|
+
const turn = yield runOneTurn({
|
|
52
|
+
baseUrl,
|
|
47
53
|
message,
|
|
48
54
|
sessionId,
|
|
49
|
-
continuationToken,
|
|
50
|
-
?
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
:
|
|
54
|
-
|
|
55
|
-
:
|
|
55
|
+
continuationToken,
|
|
56
|
+
startIndex: sessionId === undefined ? 0 : nextEventIndex,
|
|
57
|
+
auth,
|
|
58
|
+
timeoutMs: options.timeoutMs,
|
|
59
|
+
onEvent: options.onEvent,
|
|
60
|
+
purpose: sessionId === undefined ? options.purpose : undefined,
|
|
61
|
+
workspaceDir: sessionId === undefined ? options.workspaceDir : undefined,
|
|
62
|
+
workspaceFiles: sessionId === undefined ? options.workspaceFiles : undefined,
|
|
63
|
+
});
|
|
56
64
|
sessionId = turn.sessionId;
|
|
57
65
|
continuationToken = turn.continuationToken;
|
|
58
66
|
allEvents.push(...turn.events);
|
|
@@ -77,11 +85,17 @@ function runOneTurn(args) {
|
|
|
77
85
|
let sessionId = args.sessionId;
|
|
78
86
|
let continuationToken = args.continuationToken;
|
|
79
87
|
if (sessionId === undefined) {
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
88
|
+
const body = { message: args.message };
|
|
89
|
+
if (args.purpose !== undefined) {
|
|
90
|
+
body.purpose = args.purpose;
|
|
91
|
+
}
|
|
92
|
+
if (args.workspaceDir !== undefined) {
|
|
93
|
+
body.workspaceDir = args.workspaceDir;
|
|
94
|
+
}
|
|
95
|
+
if (args.workspaceFiles !== undefined) {
|
|
96
|
+
body.workspaceFiles = args.workspaceFiles;
|
|
97
|
+
}
|
|
98
|
+
const created = yield postJson(args.baseUrl, "/v1/session", body, args.auth);
|
|
85
99
|
if (created.status >= 400 || created.body.ok === false) {
|
|
86
100
|
throw new Error(`POST /v1/session failed: ${(_a = str(created.body.error)) !== null && _a !== void 0 ? _a : created.status} ${(_b = str(created.body.message)) !== null && _b !== void 0 ? _b : ""}`.trim());
|
|
87
101
|
}
|
|
@@ -89,7 +103,7 @@ function runOneTurn(args) {
|
|
|
89
103
|
continuationToken = str(created.body.continuationToken);
|
|
90
104
|
}
|
|
91
105
|
else {
|
|
92
|
-
const resp = yield postJson(args.baseUrl, `/v1/session/${sessionId}`, { message: args.message, continuationToken }, args.
|
|
106
|
+
const resp = yield postJson(args.baseUrl, `/v1/session/${sessionId}`, { message: args.message, continuationToken }, args.auth);
|
|
93
107
|
if (resp.status >= 400 || resp.body.ok === false) {
|
|
94
108
|
throw new Error(`follow-up failed: ${(_c = str(resp.body.error)) !== null && _c !== void 0 ? _c : resp.status}: ${(_d = str(resp.body.message)) !== null && _d !== void 0 ? _d : ""}`.trim());
|
|
95
109
|
}
|
|
@@ -102,7 +116,7 @@ function runOneTurn(args) {
|
|
|
102
116
|
baseUrl: args.baseUrl,
|
|
103
117
|
sessionId,
|
|
104
118
|
startIndex: args.startIndex,
|
|
105
|
-
|
|
119
|
+
auth: args.auth,
|
|
106
120
|
timeoutMs: args.timeoutMs,
|
|
107
121
|
onEvent: args.onEvent,
|
|
108
122
|
});
|
|
@@ -121,7 +135,7 @@ function collectStream(args) {
|
|
|
121
135
|
: setTimeout(() => controller.abort(), args.timeoutMs);
|
|
122
136
|
try {
|
|
123
137
|
const resp = yield fetch(`${args.baseUrl}/v1/session/${args.sessionId}/stream?startIndex=${args.startIndex}`, {
|
|
124
|
-
headers:
|
|
138
|
+
headers: mergeRequestHeaders(args.auth),
|
|
125
139
|
signal: controller.signal,
|
|
126
140
|
});
|
|
127
141
|
if (!resp.ok || resp.body === null) {
|
|
@@ -178,16 +192,11 @@ function collectStream(args) {
|
|
|
178
192
|
}
|
|
179
193
|
});
|
|
180
194
|
}
|
|
181
|
-
function
|
|
182
|
-
return bearerToken === undefined
|
|
183
|
-
? {}
|
|
184
|
-
: { authorization: `Bearer ${bearerToken}` };
|
|
185
|
-
}
|
|
186
|
-
function postJson(baseUrl, path, body, bearerToken) {
|
|
195
|
+
function postJson(baseUrl, path, body, auth) {
|
|
187
196
|
return __awaiter(this, void 0, void 0, function* () {
|
|
188
197
|
const resp = yield fetch(`${baseUrl}${path}`, {
|
|
189
198
|
method: "POST",
|
|
190
|
-
headers: Object.assign({ "content-type": "application/json" },
|
|
199
|
+
headers: Object.assign({ "content-type": "application/json" }, mergeRequestHeaders(auth)),
|
|
191
200
|
body: JSON.stringify(body),
|
|
192
201
|
});
|
|
193
202
|
const text = yield resp.text();
|
|
@@ -200,6 +209,12 @@ function postJson(baseUrl, path, body, bearerToken) {
|
|
|
200
209
|
parsed = { message: text };
|
|
201
210
|
}
|
|
202
211
|
}
|
|
212
|
+
const anyrunReason = resp.headers.get("x-anyrun-failure-reason");
|
|
213
|
+
if (anyrunReason !== null &&
|
|
214
|
+
anyrunReason !== "" &&
|
|
215
|
+
(parsed.message === undefined || parsed.message === "")) {
|
|
216
|
+
parsed.message = anyrunReason;
|
|
217
|
+
}
|
|
203
218
|
return { status: resp.status, body: parsed };
|
|
204
219
|
});
|
|
205
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/internal/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2BH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAOhB,YAAY,EACb,MAAM,aAAa,CAAC;AAoFrB,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAapE,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAYD,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAY,GAAG,0BAA+B,GACtD,OAAO,CAAC,gBAAgB,CAAC,CAylB3B"}
|