@minpeter/pss-runtime 0.1.0-next.1 → 0.1.0-next.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/README.md +290 -61
- package/dist/agent-host-session-store.js +10 -0
- package/dist/agent-host-session-store.js.map +1 -0
- package/dist/agent-loop.js +57 -28
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent-namespace.js +6 -3
- package/dist/agent-namespace.js.map +1 -1
- package/dist/agent-options.d.ts +29 -0
- package/dist/agent-options.js +16 -0
- package/dist/agent-options.js.map +1 -0
- package/dist/agent-resume.js +63 -0
- package/dist/agent-resume.js.map +1 -0
- package/dist/agent-session-entry.d.ts +13 -0
- package/dist/agent.d.ts +8 -44
- package/dist/agent.js +61 -83
- package/dist/agent.js.map +1 -1
- package/dist/cloudflare/cloudflare-agent-context.d.ts +40 -0
- package/dist/cloudflare/cloudflare-agent-context.js +37 -0
- package/dist/cloudflare/cloudflare-agent-context.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-budget.d.ts +18 -0
- package/dist/cloudflare/cloudflare-alarm-budget.js +77 -0
- package/dist/cloudflare/cloudflare-alarm-budget.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.d.ts +45 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.js +103 -0
- package/dist/cloudflare/cloudflare-alarm-drainer.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.d.ts +13 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.js +81 -0
- package/dist/cloudflare/cloudflare-alarm-run-drain.js.map +1 -0
- package/dist/cloudflare/cloudflare-alarm-work.js +110 -0
- package/dist/cloudflare/cloudflare-alarm-work.js.map +1 -0
- package/dist/cloudflare/cloudflare-checkpoint-store.js +39 -0
- package/dist/cloudflare/cloudflare-checkpoint-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.d.ts +21 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.js +11 -0
- package/dist/cloudflare/cloudflare-durable-object-fetch.js.map +1 -0
- package/dist/cloudflare/cloudflare-event-store.js +33 -0
- package/dist/cloudflare/cloudflare-event-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-execution-session-store.js +40 -0
- package/dist/cloudflare/cloudflare-execution-session-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-execution-store.js +35 -0
- package/dist/cloudflare/cloudflare-execution-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-host.d.ts +61 -0
- package/dist/cloudflare/cloudflare-host.js +113 -0
- package/dist/cloudflare/cloudflare-host.js.map +1 -0
- package/dist/cloudflare/cloudflare-notification-store.js +59 -0
- package/dist/cloudflare/cloudflare-notification-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-run-store.js +81 -0
- package/dist/cloudflare/cloudflare-run-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-store-utils.js +43 -0
- package/dist/cloudflare/cloudflare-store-utils.js.map +1 -0
- package/dist/cloudflare/durable-object-storage.d.ts +20 -0
- package/dist/cloudflare/durable-object-storage.js +76 -0
- package/dist/cloudflare/durable-object-storage.js.map +1 -0
- package/dist/cloudflare/index.d.ts +7 -0
- package/dist/cloudflare/index.js +6 -0
- package/dist/execution/capabilities.d.ts +40 -0
- package/dist/execution/host.d.ts +9 -0
- package/dist/execution/host.js +62 -0
- package/dist/execution/host.js.map +1 -0
- package/dist/execution/index.d.ts +6 -0
- package/dist/execution/index.js +4 -0
- package/dist/execution/memory-notifications.js +54 -0
- package/dist/execution/memory-notifications.js.map +1 -0
- package/dist/execution/memory-state.js +34 -0
- package/dist/execution/memory-state.js.map +1 -0
- package/dist/execution/memory-store.js +203 -0
- package/dist/execution/memory-store.js.map +1 -0
- package/dist/execution/memory.d.ts +7 -0
- package/dist/execution/memory.js +28 -0
- package/dist/execution/memory.js.map +1 -0
- package/dist/execution/types.d.ts +150 -0
- package/dist/index.d.ts +13 -6
- package/dist/index.js +6 -1
- package/dist/llm-tool-execution.d.ts +35 -0
- package/dist/llm-tool-execution.js +126 -0
- package/dist/llm-tool-execution.js.map +1 -0
- package/dist/llm.d.ts +11 -15
- package/dist/llm.js +5 -3
- package/dist/llm.js.map +1 -1
- package/dist/plugins.d.ts +42 -0
- package/dist/plugins.js +43 -0
- package/dist/plugins.js.map +1 -0
- package/dist/session/delegate-input.d.ts +9 -0
- package/dist/session/delegate-input.js +16 -0
- package/dist/session/delegate-input.js.map +1 -0
- package/dist/session/events.d.ts +43 -22
- package/dist/session/events.js +41 -0
- package/dist/session/events.js.map +1 -0
- package/dist/session/input-meta-types.d.ts +10 -0
- package/dist/session/input-meta.d.ts +13 -0
- package/dist/session/input-meta.js +45 -0
- package/dist/session/input-meta.js.map +1 -0
- package/dist/session/input.d.ts +4 -0
- package/dist/session/mapping.js +4 -2
- package/dist/session/mapping.js.map +1 -1
- package/dist/session/runtime-input-emit.js +41 -0
- package/dist/session/runtime-input-emit.js.map +1 -0
- package/dist/session/runtime-input.js +10 -24
- package/dist/session/runtime-input.js.map +1 -1
- package/dist/session/session-errors.js +1 -6
- package/dist/session/session-errors.js.map +1 -1
- package/dist/session/session-events.js +73 -0
- package/dist/session/session-events.js.map +1 -0
- package/dist/session/session-execution.js +88 -0
- package/dist/session/session-execution.js.map +1 -0
- package/dist/session/session-notification.js +59 -0
- package/dist/session/session-notification.js.map +1 -0
- package/dist/session/session-runtime-drain.js +3 -9
- package/dist/session/session-runtime-drain.js.map +1 -1
- package/dist/session/session-turn-processor.js +125 -0
- package/dist/session/session-turn-processor.js.map +1 -0
- package/dist/session/session.js +81 -102
- package/dist/session/session.js.map +1 -1
- package/dist/session/snapshot.js.map +1 -1
- package/package.json +16 -1
- package/dist/agent-validation.js +0 -35
- package/dist/agent-validation.js.map +0 -1
- package/dist/child-session-cleanups.js +0 -61
- package/dist/child-session-cleanups.js.map +0 -1
- package/dist/hooks.d.ts +0 -32
- package/dist/subagent-job-cancel.js +0 -28
- package/dist/subagent-job-cancel.js.map +0 -1
- package/dist/subagent-job-output.js +0 -63
- package/dist/subagent-job-output.js.map +0 -1
- package/dist/subagent-jobs.js +0 -151
- package/dist/subagent-jobs.js.map +0 -1
- package/dist/subagent-prompt-schema.js +0 -114
- package/dist/subagent-prompt-schema.js.map +0 -1
- package/dist/subagent-run.js +0 -111
- package/dist/subagent-run.js.map +0 -1
- package/dist/subagents.js +0 -92
- package/dist/subagents.js.map +0 -1
- /package/dist/session/{runtime-input.d.ts → session-execution.d.ts} +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SessionStore } from "../session/store/types.js";
|
|
2
|
+
import { ExecutionHost, ExecutionScheduler } from "../execution/types.js";
|
|
3
|
+
import { CloudflareDurableObjectStorage as CloudflareDurableObjectStorage$1, InMemoryCloudflareDurableObjectStorage as InMemoryCloudflareDurableObjectStorage$1 } from "./durable-object-storage.js";
|
|
4
|
+
|
|
5
|
+
//#region src/cloudflare/cloudflare-host.d.ts
|
|
6
|
+
interface CloudflareScheduledSessionPrompt {
|
|
7
|
+
readonly idempotencyKey?: string;
|
|
8
|
+
readonly notificationId?: string;
|
|
9
|
+
readonly runId?: string;
|
|
10
|
+
readonly sessionKey: string;
|
|
11
|
+
}
|
|
12
|
+
type CloudflareDurableObjectStorage = CloudflareDurableObjectStorage$1;
|
|
13
|
+
type CloudflareDurableObjectId = unknown;
|
|
14
|
+
interface CloudflareDurableObjectStub {
|
|
15
|
+
fetch(request: Request): Promise<Response>;
|
|
16
|
+
}
|
|
17
|
+
interface CloudflareDurableObjectNamespace<Stub extends CloudflareDurableObjectStub = CloudflareDurableObjectStub> {
|
|
18
|
+
get(id: CloudflareDurableObjectId): Stub;
|
|
19
|
+
idFromName(name: string): CloudflareDurableObjectId;
|
|
20
|
+
}
|
|
21
|
+
interface CloudflareDurableObjectState {
|
|
22
|
+
readonly storage: CloudflareDurableObjectStorage;
|
|
23
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
24
|
+
}
|
|
25
|
+
declare class InMemoryCloudflareDurableObjectStorage extends InMemoryCloudflareDurableObjectStorage$1 {}
|
|
26
|
+
declare function createCloudflareDurableObjectHost({
|
|
27
|
+
prefix,
|
|
28
|
+
sessionStore,
|
|
29
|
+
storage,
|
|
30
|
+
scheduler
|
|
31
|
+
}: {
|
|
32
|
+
readonly prefix?: string;
|
|
33
|
+
readonly scheduler?: ExecutionScheduler;
|
|
34
|
+
readonly sessionStore?: SessionStore;
|
|
35
|
+
readonly storage: CloudflareDurableObjectStorage;
|
|
36
|
+
}): ExecutionHost;
|
|
37
|
+
declare function createCloudflareAlarmScheduler({
|
|
38
|
+
prefix,
|
|
39
|
+
storage
|
|
40
|
+
}: {
|
|
41
|
+
readonly prefix?: string;
|
|
42
|
+
readonly storage: CloudflareDurableObjectStorage;
|
|
43
|
+
}): ExecutionScheduler;
|
|
44
|
+
declare function listScheduledCloudflareRuns(storage: CloudflareDurableObjectStorage, options?: {
|
|
45
|
+
readonly prefix?: string;
|
|
46
|
+
}): Promise<readonly string[]>;
|
|
47
|
+
declare function ackScheduledCloudflareRun(storage: CloudflareDurableObjectStorage, runId: string, options?: {
|
|
48
|
+
readonly prefix?: string;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
declare function listScheduledCloudflareSessionPrompts(storage: CloudflareDurableObjectStorage, options?: {
|
|
51
|
+
readonly prefix?: string;
|
|
52
|
+
}): Promise<readonly CloudflareScheduledSessionPrompt[]>;
|
|
53
|
+
declare function ackScheduledCloudflareSessionPrompt(storage: CloudflareDurableObjectStorage, prompt: CloudflareScheduledSessionPrompt, options?: {
|
|
54
|
+
readonly prefix?: string;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
declare function rescheduleCloudflareAlarm(storage: CloudflareDurableObjectStorage, options?: {
|
|
57
|
+
readonly runAfterMs?: number;
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
//#endregion
|
|
60
|
+
export { CloudflareDurableObjectId, CloudflareDurableObjectNamespace, CloudflareDurableObjectState, CloudflareDurableObjectStorage, CloudflareDurableObjectStub, CloudflareScheduledSessionPrompt, InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm };
|
|
61
|
+
//# sourceMappingURL=cloudflare-host.d.ts.map
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { DurableObjectExecutionStore } from "./cloudflare-execution-store.js";
|
|
2
|
+
import { InMemoryCloudflareDurableObjectStorage as InMemoryCloudflareDurableObjectStorage$1 } from "./durable-object-storage.js";
|
|
3
|
+
//#region src/cloudflare/cloudflare-host.ts
|
|
4
|
+
const defaultPrefix = "pss-runtime";
|
|
5
|
+
var InMemoryCloudflareDurableObjectStorage = class extends InMemoryCloudflareDurableObjectStorage$1 {};
|
|
6
|
+
function createCloudflareDurableObjectHost({ prefix = defaultPrefix, sessionStore, storage, scheduler = createCloudflareAlarmScheduler({
|
|
7
|
+
prefix,
|
|
8
|
+
storage
|
|
9
|
+
}) }) {
|
|
10
|
+
const store = new DurableObjectExecutionStore({
|
|
11
|
+
prefix,
|
|
12
|
+
storage
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
capabilities: {},
|
|
16
|
+
scheduler,
|
|
17
|
+
store: sessionStore ? executionStoreWithSessions(store, sessionStore) : store
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function createCloudflareAlarmScheduler({ prefix = defaultPrefix, storage }) {
|
|
21
|
+
return {
|
|
22
|
+
enqueueRun: async (runId, options) => {
|
|
23
|
+
await appendUnique(storage, scheduledRunsKey(prefix), runId);
|
|
24
|
+
await setAlarm(storage, options?.runAfterMs ?? 0);
|
|
25
|
+
},
|
|
26
|
+
resumeSession: async (sessionKey, options) => {
|
|
27
|
+
await appendSessionPrompt(storage, scheduledSessionPromptsKey(prefix), {
|
|
28
|
+
idempotencyKey: options?.idempotencyKey,
|
|
29
|
+
notificationId: options?.notificationId,
|
|
30
|
+
runId: options?.runId,
|
|
31
|
+
sessionKey
|
|
32
|
+
});
|
|
33
|
+
await setAlarm(storage, 0);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function listScheduledCloudflareRuns(storage, options = {}) {
|
|
38
|
+
return await readList(storage, scheduledRunsKey(options.prefix ?? defaultPrefix));
|
|
39
|
+
}
|
|
40
|
+
async function ackScheduledCloudflareRun(storage, runId, options = {}) {
|
|
41
|
+
await removeFromList(storage, scheduledRunsKey(options.prefix ?? defaultPrefix), (scheduledRunId) => scheduledRunId === runId);
|
|
42
|
+
}
|
|
43
|
+
async function listScheduledCloudflareSessionPrompts(storage, options = {}) {
|
|
44
|
+
return await readList(storage, scheduledSessionPromptsKey(options.prefix ?? defaultPrefix));
|
|
45
|
+
}
|
|
46
|
+
async function ackScheduledCloudflareSessionPrompt(storage, prompt, options = {}) {
|
|
47
|
+
await removeFromList(storage, scheduledSessionPromptsKey(options.prefix ?? defaultPrefix), (scheduledPrompt) => sessionPromptsMatch(scheduledPrompt, prompt));
|
|
48
|
+
}
|
|
49
|
+
async function rescheduleCloudflareAlarm(storage, options = {}) {
|
|
50
|
+
await setAlarm(storage, options.runAfterMs ?? 0);
|
|
51
|
+
}
|
|
52
|
+
async function appendUnique(storage, key, value) {
|
|
53
|
+
await withTransaction(storage, async (tx) => {
|
|
54
|
+
const values = await readList(tx, key);
|
|
55
|
+
if (!values.includes(value)) {
|
|
56
|
+
values.push(value);
|
|
57
|
+
await tx.put(key, values);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function appendSessionPrompt(storage, key, prompt) {
|
|
62
|
+
await withTransaction(storage, async (tx) => {
|
|
63
|
+
const values = await readList(tx, key);
|
|
64
|
+
if (!values.some((existing) => existing.sessionKey === prompt.sessionKey && existing.idempotencyKey === prompt.idempotencyKey && existing.runId === prompt.runId)) {
|
|
65
|
+
values.push(prompt);
|
|
66
|
+
await tx.put(key, values);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function removeFromList(storage, key, shouldRemove) {
|
|
71
|
+
await withTransaction(storage, async (tx) => {
|
|
72
|
+
const remaining = (await readList(tx, key)).filter((value) => !shouldRemove(value));
|
|
73
|
+
await tx.put(key, remaining);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function readList(storage, key) {
|
|
77
|
+
return (await storage.get(key) ?? []).map((item) => structuredClone(item));
|
|
78
|
+
}
|
|
79
|
+
async function setAlarm(storage, runAfterMs) {
|
|
80
|
+
await storage.setAlarm?.(Date.now() + Math.max(0, runAfterMs));
|
|
81
|
+
}
|
|
82
|
+
async function withTransaction(storage, fn) {
|
|
83
|
+
return storage.transaction ? await storage.transaction(fn) : await fn(storage);
|
|
84
|
+
}
|
|
85
|
+
function scheduledRunsKey(prefix) {
|
|
86
|
+
return `${prefix}:scheduled-runs`;
|
|
87
|
+
}
|
|
88
|
+
function scheduledSessionPromptsKey(prefix) {
|
|
89
|
+
return `${prefix}:scheduled-session-prompts`;
|
|
90
|
+
}
|
|
91
|
+
function sessionPromptsMatch(left, right) {
|
|
92
|
+
return left.idempotencyKey === right.idempotencyKey && left.notificationId === right.notificationId && left.runId === right.runId && left.sessionKey === right.sessionKey;
|
|
93
|
+
}
|
|
94
|
+
function executionStoreWithSessions(store, sessions) {
|
|
95
|
+
return {
|
|
96
|
+
checkpoints: store.checkpoints,
|
|
97
|
+
events: store.events,
|
|
98
|
+
notifications: store.notifications,
|
|
99
|
+
runs: store.runs,
|
|
100
|
+
sessions,
|
|
101
|
+
transaction: (fn) => store.transaction((tx) => fn({
|
|
102
|
+
checkpoints: tx.checkpoints,
|
|
103
|
+
events: tx.events,
|
|
104
|
+
notifications: tx.notifications,
|
|
105
|
+
runs: tx.runs,
|
|
106
|
+
sessions
|
|
107
|
+
}))
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//#endregion
|
|
111
|
+
export { InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=cloudflare-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-host.js","names":["BaseInMemoryCloudflareDurableObjectStorage"],"sources":["../../src/cloudflare/cloudflare-host.ts"],"sourcesContent":["import type { ExecutionHost, ExecutionScheduler } from \"../execution\";\nimport type { SessionStore } from \"../index\";\nimport { DurableObjectExecutionStore } from \"./cloudflare-execution-store\";\nimport {\n InMemoryCloudflareDurableObjectStorage as BaseInMemoryCloudflareDurableObjectStorage,\n type CloudflareDurableObjectStorage as DurableObjectStoragePort,\n} from \"./durable-object-storage\";\n\nconst defaultPrefix = \"pss-runtime\";\n\nexport interface CloudflareScheduledSessionPrompt {\n readonly idempotencyKey?: string;\n readonly notificationId?: string;\n readonly runId?: string;\n readonly sessionKey: string;\n}\n\nexport type CloudflareDurableObjectStorage = DurableObjectStoragePort;\n\nexport type CloudflareDurableObjectId = unknown;\n\nexport interface CloudflareDurableObjectStub {\n fetch(request: Request): Promise<Response>;\n}\n\nexport interface CloudflareDurableObjectNamespace<\n Stub extends CloudflareDurableObjectStub = CloudflareDurableObjectStub,\n> {\n get(id: CloudflareDurableObjectId): Stub;\n idFromName(name: string): CloudflareDurableObjectId;\n}\n\nexport interface CloudflareDurableObjectState {\n readonly storage: CloudflareDurableObjectStorage;\n waitUntil(promise: Promise<unknown>): void;\n}\n\nexport class InMemoryCloudflareDurableObjectStorage extends BaseInMemoryCloudflareDurableObjectStorage {}\n\nexport function createCloudflareDurableObjectHost({\n prefix = defaultPrefix,\n sessionStore,\n storage,\n scheduler = createCloudflareAlarmScheduler({ prefix, storage }),\n}: {\n readonly prefix?: string;\n readonly scheduler?: ExecutionScheduler;\n readonly sessionStore?: SessionStore;\n readonly storage: CloudflareDurableObjectStorage;\n}): ExecutionHost {\n const store = new DurableObjectExecutionStore({ prefix, storage });\n return {\n capabilities: {},\n scheduler,\n store: sessionStore\n ? executionStoreWithSessions(store, sessionStore)\n : store,\n };\n}\n\nexport function createCloudflareAlarmScheduler({\n prefix = defaultPrefix,\n storage,\n}: {\n readonly prefix?: string;\n readonly storage: CloudflareDurableObjectStorage;\n}): ExecutionScheduler {\n return {\n enqueueRun: async (runId, options) => {\n await appendUnique(storage, scheduledRunsKey(prefix), runId);\n await setAlarm(storage, options?.runAfterMs ?? 0);\n },\n resumeSession: async (sessionKey, options) => {\n await appendSessionPrompt(storage, scheduledSessionPromptsKey(prefix), {\n idempotencyKey: options?.idempotencyKey,\n notificationId: options?.notificationId,\n runId: options?.runId,\n sessionKey,\n });\n await setAlarm(storage, 0);\n },\n };\n}\n\nexport async function listScheduledCloudflareRuns(\n storage: CloudflareDurableObjectStorage,\n options: { readonly prefix?: string } = {}\n): Promise<readonly string[]> {\n return await readList<string>(\n storage,\n scheduledRunsKey(options.prefix ?? defaultPrefix)\n );\n}\n\nexport async function ackScheduledCloudflareRun(\n storage: CloudflareDurableObjectStorage,\n runId: string,\n options: { readonly prefix?: string } = {}\n): Promise<void> {\n await removeFromList<string>(\n storage,\n scheduledRunsKey(options.prefix ?? defaultPrefix),\n (scheduledRunId) => scheduledRunId === runId\n );\n}\n\nexport async function listScheduledCloudflareSessionPrompts(\n storage: CloudflareDurableObjectStorage,\n options: { readonly prefix?: string } = {}\n): Promise<readonly CloudflareScheduledSessionPrompt[]> {\n return await readList<CloudflareScheduledSessionPrompt>(\n storage,\n scheduledSessionPromptsKey(options.prefix ?? defaultPrefix)\n );\n}\n\nexport async function ackScheduledCloudflareSessionPrompt(\n storage: CloudflareDurableObjectStorage,\n prompt: CloudflareScheduledSessionPrompt,\n options: { readonly prefix?: string } = {}\n): Promise<void> {\n await removeFromList<CloudflareScheduledSessionPrompt>(\n storage,\n scheduledSessionPromptsKey(options.prefix ?? defaultPrefix),\n (scheduledPrompt) => sessionPromptsMatch(scheduledPrompt, prompt)\n );\n}\n\nexport async function rescheduleCloudflareAlarm(\n storage: CloudflareDurableObjectStorage,\n options: { readonly runAfterMs?: number } = {}\n): Promise<void> {\n await setAlarm(storage, options.runAfterMs ?? 0);\n}\n\nasync function appendUnique(\n storage: CloudflareDurableObjectStorage,\n key: string,\n value: string\n): Promise<void> {\n await withTransaction(storage, async (tx) => {\n const values = await readList<string>(tx, key);\n if (!values.includes(value)) {\n values.push(value);\n await tx.put(key, values);\n }\n });\n}\n\nasync function appendSessionPrompt(\n storage: CloudflareDurableObjectStorage,\n key: string,\n prompt: CloudflareScheduledSessionPrompt\n): Promise<void> {\n await withTransaction(storage, async (tx) => {\n const values = await readList<CloudflareScheduledSessionPrompt>(tx, key);\n const isDuplicate = values.some(\n (existing) =>\n existing.sessionKey === prompt.sessionKey &&\n existing.idempotencyKey === prompt.idempotencyKey &&\n existing.runId === prompt.runId\n );\n if (!isDuplicate) {\n values.push(prompt);\n await tx.put(key, values);\n }\n });\n}\n\nasync function removeFromList<T>(\n storage: CloudflareDurableObjectStorage,\n key: string,\n shouldRemove: (value: T) => boolean\n): Promise<void> {\n await withTransaction(storage, async (tx) => {\n const remaining = (await readList<T>(tx, key)).filter(\n (value) => !shouldRemove(value)\n );\n await tx.put(key, remaining);\n });\n}\n\nasync function readList<T>(\n storage: CloudflareDurableObjectStorage,\n key: string\n): Promise<T[]> {\n return ((await storage.get<readonly T[]>(key)) ?? []).map((item) =>\n structuredClone(item)\n );\n}\n\nasync function setAlarm(\n storage: CloudflareDurableObjectStorage,\n runAfterMs: number\n): Promise<void> {\n await storage.setAlarm?.(Date.now() + Math.max(0, runAfterMs));\n}\n\nasync function withTransaction<T>(\n storage: CloudflareDurableObjectStorage,\n fn: (storage: CloudflareDurableObjectStorage) => Promise<T>\n): Promise<T> {\n return storage.transaction\n ? await storage.transaction(fn)\n : await fn(storage);\n}\n\nfunction scheduledRunsKey(prefix: string): string {\n return `${prefix}:scheduled-runs`;\n}\n\nfunction scheduledSessionPromptsKey(prefix: string): string {\n return `${prefix}:scheduled-session-prompts`;\n}\n\nfunction sessionPromptsMatch(\n left: CloudflareScheduledSessionPrompt,\n right: CloudflareScheduledSessionPrompt\n): boolean {\n return (\n left.idempotencyKey === right.idempotencyKey &&\n left.notificationId === right.notificationId &&\n left.runId === right.runId &&\n left.sessionKey === right.sessionKey\n );\n}\n\nfunction executionStoreWithSessions(\n store: ExecutionHost[\"store\"],\n sessions: SessionStore\n): ExecutionHost[\"store\"] {\n return {\n checkpoints: store.checkpoints,\n events: store.events,\n notifications: store.notifications,\n runs: store.runs,\n sessions,\n transaction: (fn) =>\n store.transaction((tx) =>\n fn({\n checkpoints: tx.checkpoints,\n events: tx.events,\n notifications: tx.notifications,\n runs: tx.runs,\n sessions,\n })\n ),\n };\n}\n"],"mappings":";;;AAQA,MAAM,gBAAgB;AA6BtB,IAAa,yCAAb,cAA4DA,yCAA2C,CAAC;AAExG,SAAgB,kCAAkC,EAChD,SAAS,eACT,cACA,SACA,YAAY,+BAA+B;CAAE;CAAQ;AAAQ,CAAC,KAM9C;CAChB,MAAM,QAAQ,IAAI,4BAA4B;EAAE;EAAQ;CAAQ,CAAC;CACjE,OAAO;EACL,cAAc,CAAC;EACf;EACA,OAAO,eACH,2BAA2B,OAAO,YAAY,IAC9C;CACN;AACF;AAEA,SAAgB,+BAA+B,EAC7C,SAAS,eACT,WAIqB;CACrB,OAAO;EACL,YAAY,OAAO,OAAO,YAAY;GACpC,MAAM,aAAa,SAAS,iBAAiB,MAAM,GAAG,KAAK;GAC3D,MAAM,SAAS,SAAS,SAAS,cAAc,CAAC;EAClD;EACA,eAAe,OAAO,YAAY,YAAY;GAC5C,MAAM,oBAAoB,SAAS,2BAA2B,MAAM,GAAG;IACrE,gBAAgB,SAAS;IACzB,gBAAgB,SAAS;IACzB,OAAO,SAAS;IAChB;GACF,CAAC;GACD,MAAM,SAAS,SAAS,CAAC;EAC3B;CACF;AACF;AAEA,eAAsB,4BACpB,SACA,UAAwC,CAAC,GACb;CAC5B,OAAO,MAAM,SACX,SACA,iBAAiB,QAAQ,UAAU,aAAa,CAClD;AACF;AAEA,eAAsB,0BACpB,SACA,OACA,UAAwC,CAAC,GAC1B;CACf,MAAM,eACJ,SACA,iBAAiB,QAAQ,UAAU,aAAa,IAC/C,mBAAmB,mBAAmB,KACzC;AACF;AAEA,eAAsB,sCACpB,SACA,UAAwC,CAAC,GACa;CACtD,OAAO,MAAM,SACX,SACA,2BAA2B,QAAQ,UAAU,aAAa,CAC5D;AACF;AAEA,eAAsB,oCACpB,SACA,QACA,UAAwC,CAAC,GAC1B;CACf,MAAM,eACJ,SACA,2BAA2B,QAAQ,UAAU,aAAa,IACzD,oBAAoB,oBAAoB,iBAAiB,MAAM,CAClE;AACF;AAEA,eAAsB,0BACpB,SACA,UAA4C,CAAC,GAC9B;CACf,MAAM,SAAS,SAAS,QAAQ,cAAc,CAAC;AACjD;AAEA,eAAe,aACb,SACA,KACA,OACe;CACf,MAAM,gBAAgB,SAAS,OAAO,OAAO;EAC3C,MAAM,SAAS,MAAM,SAAiB,IAAI,GAAG;EAC7C,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG;GAC3B,OAAO,KAAK,KAAK;GACjB,MAAM,GAAG,IAAI,KAAK,MAAM;EAC1B;CACF,CAAC;AACH;AAEA,eAAe,oBACb,SACA,KACA,QACe;CACf,MAAM,gBAAgB,SAAS,OAAO,OAAO;EAC3C,MAAM,SAAS,MAAM,SAA2C,IAAI,GAAG;EAOvE,IAAI,CANgB,OAAO,MACxB,aACC,SAAS,eAAe,OAAO,cAC/B,SAAS,mBAAmB,OAAO,kBACnC,SAAS,UAAU,OAAO,KAEf,GAAG;GAChB,OAAO,KAAK,MAAM;GAClB,MAAM,GAAG,IAAI,KAAK,MAAM;EAC1B;CACF,CAAC;AACH;AAEA,eAAe,eACb,SACA,KACA,cACe;CACf,MAAM,gBAAgB,SAAS,OAAO,OAAO;EAC3C,MAAM,aAAa,MAAM,SAAY,IAAI,GAAG,GAAG,QAC5C,UAAU,CAAC,aAAa,KAAK,CAChC;EACA,MAAM,GAAG,IAAI,KAAK,SAAS;CAC7B,CAAC;AACH;AAEA,eAAe,SACb,SACA,KACc;CACd,QAAS,MAAM,QAAQ,IAAkB,GAAG,KAAM,CAAC,GAAG,KAAK,SACzD,gBAAgB,IAAI,CACtB;AACF;AAEA,eAAe,SACb,SACA,YACe;CACf,MAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC;AAC/D;AAEA,eAAe,gBACb,SACA,IACY;CACZ,OAAO,QAAQ,cACX,MAAM,QAAQ,YAAY,EAAE,IAC5B,MAAM,GAAG,OAAO;AACtB;AAEA,SAAS,iBAAiB,QAAwB;CAChD,OAAO,GAAG,OAAO;AACnB;AAEA,SAAS,2BAA2B,QAAwB;CAC1D,OAAO,GAAG,OAAO;AACnB;AAEA,SAAS,oBACP,MACA,OACS;CACT,OACE,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,UAAU,MAAM,SACrB,KAAK,eAAe,MAAM;AAE9B;AAEA,SAAS,2BACP,OACA,UACwB;CACxB,OAAO;EACL,aAAa,MAAM;EACnB,QAAQ,MAAM;EACd,eAAe,MAAM;EACrB,MAAM,MAAM;EACZ;EACA,cAAc,OACZ,MAAM,aAAa,OACjB,GAAG;GACD,aAAa,GAAG;GAChB,QAAQ,GAAG;GACX,eAAe,GAAG;GAClB,MAAM,GAAG;GACT;EACF,CAAC,CACH;CACJ;AACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getNotification, putNotification, withTransaction } from "./cloudflare-store-utils.js";
|
|
2
|
+
//#region src/cloudflare/cloudflare-notification-store.ts
|
|
3
|
+
var DurableObjectNotificationInbox = class {
|
|
4
|
+
#prefix;
|
|
5
|
+
#storage;
|
|
6
|
+
constructor(storage, prefix) {
|
|
7
|
+
this.#prefix = prefix;
|
|
8
|
+
this.#storage = storage;
|
|
9
|
+
}
|
|
10
|
+
async claimByIdempotencyKey(idempotencyKey) {
|
|
11
|
+
return await withTransaction(this.#storage, async (storage) => {
|
|
12
|
+
const record = await getNotification(storage, this.#prefix, idempotencyKey);
|
|
13
|
+
if (!record) return {
|
|
14
|
+
ok: false,
|
|
15
|
+
reason: "not-found"
|
|
16
|
+
};
|
|
17
|
+
if (record.status !== "pending") return {
|
|
18
|
+
ok: false,
|
|
19
|
+
reason: "already-claimed",
|
|
20
|
+
record
|
|
21
|
+
};
|
|
22
|
+
const claimed = {
|
|
23
|
+
...record,
|
|
24
|
+
status: "acked"
|
|
25
|
+
};
|
|
26
|
+
await putNotification(storage, this.#prefix, claimed);
|
|
27
|
+
return {
|
|
28
|
+
ok: true,
|
|
29
|
+
record: claimed
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async enqueue(record) {
|
|
34
|
+
return await withTransaction(this.#storage, async (storage) => {
|
|
35
|
+
const current = await getNotification(storage, this.#prefix, record.idempotencyKey);
|
|
36
|
+
if (current) return {
|
|
37
|
+
existingNotificationId: current.notificationId,
|
|
38
|
+
ok: false,
|
|
39
|
+
reason: "duplicate"
|
|
40
|
+
};
|
|
41
|
+
await putNotification(storage, this.#prefix, record);
|
|
42
|
+
return { ok: true };
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async getByIdempotencyKey(idempotencyKey) {
|
|
46
|
+
return await getNotification(this.#storage, this.#prefix, idempotencyKey);
|
|
47
|
+
}
|
|
48
|
+
async releaseByIdempotencyKey(idempotencyKey) {
|
|
49
|
+
const record = await this.getByIdempotencyKey(idempotencyKey);
|
|
50
|
+
if (record?.status === "acked") await putNotification(this.#storage, this.#prefix, {
|
|
51
|
+
...record,
|
|
52
|
+
status: "pending"
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { DurableObjectNotificationInbox };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=cloudflare-notification-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-notification-store.js","names":["#prefix","#storage"],"sources":["../../src/cloudflare/cloudflare-notification-store.ts"],"sourcesContent":["import type {\n NotificationClaimResult,\n NotificationInbox,\n NotificationRecord,\n NotificationWriteResult,\n} from \"../execution\";\nimport {\n getNotification,\n putNotification,\n withTransaction,\n} from \"./cloudflare-store-utils\";\nimport type { CloudflareDurableObjectStorage } from \"./durable-object-storage\";\n\nexport class DurableObjectNotificationInbox implements NotificationInbox {\n readonly #prefix: string;\n readonly #storage: CloudflareDurableObjectStorage;\n\n constructor(storage: CloudflareDurableObjectStorage, prefix: string) {\n this.#prefix = prefix;\n this.#storage = storage;\n }\n\n async claimByIdempotencyKey(\n idempotencyKey: string\n ): Promise<NotificationClaimResult> {\n return await withTransaction(this.#storage, async (storage) => {\n const record = await getNotification(\n storage,\n this.#prefix,\n idempotencyKey\n );\n if (!record) {\n return { ok: false, reason: \"not-found\" };\n }\n if (record.status !== \"pending\") {\n return { ok: false, reason: \"already-claimed\", record };\n }\n const claimed: NotificationRecord = { ...record, status: \"acked\" };\n await putNotification(storage, this.#prefix, claimed);\n return { ok: true, record: claimed };\n });\n }\n\n async enqueue(record: NotificationRecord): Promise<NotificationWriteResult> {\n return await withTransaction(this.#storage, async (storage) => {\n const current = await getNotification(\n storage,\n this.#prefix,\n record.idempotencyKey\n );\n if (current) {\n return {\n existingNotificationId: current.notificationId,\n ok: false,\n reason: \"duplicate\",\n };\n }\n await putNotification(storage, this.#prefix, record);\n return { ok: true };\n });\n }\n\n async getByIdempotencyKey(\n idempotencyKey: string\n ): Promise<NotificationRecord | null> {\n return await getNotification(this.#storage, this.#prefix, idempotencyKey);\n }\n\n async releaseByIdempotencyKey(idempotencyKey: string): Promise<void> {\n const record = await this.getByIdempotencyKey(idempotencyKey);\n if (record?.status === \"acked\") {\n await putNotification(this.#storage, this.#prefix, {\n ...record,\n status: \"pending\",\n });\n }\n }\n}\n"],"mappings":";;AAaA,IAAa,iCAAb,MAAyE;CACvE;CACA;CAEA,YAAY,SAAyC,QAAgB;EACnE,KAAKA,UAAU;EACf,KAAKC,WAAW;CAClB;CAEA,MAAM,sBACJ,gBACkC;EAClC,OAAO,MAAM,gBAAgB,KAAKA,UAAU,OAAO,YAAY;GAC7D,MAAM,SAAS,MAAM,gBACnB,SACA,KAAKD,SACL,cACF;GACA,IAAI,CAAC,QACH,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAY;GAE1C,IAAI,OAAO,WAAW,WACpB,OAAO;IAAE,IAAI;IAAO,QAAQ;IAAmB;GAAO;GAExD,MAAM,UAA8B;IAAE,GAAG;IAAQ,QAAQ;GAAQ;GACjE,MAAM,gBAAgB,SAAS,KAAKA,SAAS,OAAO;GACpD,OAAO;IAAE,IAAI;IAAM,QAAQ;GAAQ;EACrC,CAAC;CACH;CAEA,MAAM,QAAQ,QAA8D;EAC1E,OAAO,MAAM,gBAAgB,KAAKC,UAAU,OAAO,YAAY;GAC7D,MAAM,UAAU,MAAM,gBACpB,SACA,KAAKD,SACL,OAAO,cACT;GACA,IAAI,SACF,OAAO;IACL,wBAAwB,QAAQ;IAChC,IAAI;IACJ,QAAQ;GACV;GAEF,MAAM,gBAAgB,SAAS,KAAKA,SAAS,MAAM;GACnD,OAAO,EAAE,IAAI,KAAK;EACpB,CAAC;CACH;CAEA,MAAM,oBACJ,gBACoC;EACpC,OAAO,MAAM,gBAAgB,KAAKC,UAAU,KAAKD,SAAS,cAAc;CAC1E;CAEA,MAAM,wBAAwB,gBAAuC;EACnE,MAAM,SAAS,MAAM,KAAK,oBAAoB,cAAc;EAC5D,IAAI,QAAQ,WAAW,SACrB,MAAM,gBAAgB,KAAKC,UAAU,KAAKD,SAAS;GACjD,GAAG;GACH,QAAQ;EACV,CAAC;CAEL;AACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { getRun, indexRun, putRun, readList, storeKey, withTransaction } from "./cloudflare-store-utils.js";
|
|
2
|
+
//#region src/cloudflare/cloudflare-run-store.ts
|
|
3
|
+
const claimableStatuses = new Set([
|
|
4
|
+
"leased",
|
|
5
|
+
"queued",
|
|
6
|
+
"running",
|
|
7
|
+
"suspended"
|
|
8
|
+
]);
|
|
9
|
+
var DurableObjectRunStore = class {
|
|
10
|
+
#prefix;
|
|
11
|
+
#storage;
|
|
12
|
+
constructor(storage, prefix) {
|
|
13
|
+
this.#prefix = prefix;
|
|
14
|
+
this.#storage = storage;
|
|
15
|
+
}
|
|
16
|
+
async claim(runId, options) {
|
|
17
|
+
return await withTransaction(this.#storage, async (storage) => {
|
|
18
|
+
const run = await getRun(storage, this.#prefix, runId);
|
|
19
|
+
if (!run) return {
|
|
20
|
+
ok: false,
|
|
21
|
+
reason: "not-found"
|
|
22
|
+
};
|
|
23
|
+
if (!claimableStatuses.has(run.status)) return {
|
|
24
|
+
ok: false,
|
|
25
|
+
reason: "not-claimable"
|
|
26
|
+
};
|
|
27
|
+
if (run.lease && run.lease.leaseUntilMs > options.nowMs) return {
|
|
28
|
+
ok: false,
|
|
29
|
+
reason: "leased"
|
|
30
|
+
};
|
|
31
|
+
const lease = {
|
|
32
|
+
attempt: options.attempt,
|
|
33
|
+
leaseId: options.leaseId,
|
|
34
|
+
leaseUntilMs: options.nowMs + options.leaseMs
|
|
35
|
+
};
|
|
36
|
+
const claimed = {
|
|
37
|
+
...run,
|
|
38
|
+
lease,
|
|
39
|
+
status: "leased"
|
|
40
|
+
};
|
|
41
|
+
await putRun(storage, this.#prefix, claimed);
|
|
42
|
+
return {
|
|
43
|
+
lease,
|
|
44
|
+
ok: true,
|
|
45
|
+
record: structuredClone(claimed)
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async create(record) {
|
|
50
|
+
return await withTransaction(this.#storage, async (storage) => {
|
|
51
|
+
await putRun(storage, this.#prefix, record);
|
|
52
|
+
await indexRun(storage, this.#prefix, record);
|
|
53
|
+
return structuredClone(record);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async get(runId) {
|
|
57
|
+
return await getRun(this.#storage, this.#prefix, runId);
|
|
58
|
+
}
|
|
59
|
+
async getByDedupeKey(dedupeKey) {
|
|
60
|
+
const runId = await this.#storage.get(storeKey(this.#prefix, "run-dedupe", dedupeKey));
|
|
61
|
+
return runId ? await this.get(runId) : null;
|
|
62
|
+
}
|
|
63
|
+
async listByParentRunId(parentRunId) {
|
|
64
|
+
const runIds = await readList(this.#storage, storeKey(this.#prefix, "run-parent", parentRunId));
|
|
65
|
+
return (await Promise.all(runIds.map((runId) => this.get(runId)))).filter(isRunRecord);
|
|
66
|
+
}
|
|
67
|
+
async update(record) {
|
|
68
|
+
return await withTransaction(this.#storage, async (storage) => {
|
|
69
|
+
await putRun(storage, this.#prefix, record);
|
|
70
|
+
await indexRun(storage, this.#prefix, record);
|
|
71
|
+
return structuredClone(record);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
function isRunRecord(record) {
|
|
76
|
+
return record !== null;
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { DurableObjectRunStore };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=cloudflare-run-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-run-store.js","names":["#prefix","#storage"],"sources":["../../src/cloudflare/cloudflare-run-store.ts"],"sourcesContent":["import type {\n ClaimRunOptions,\n ClaimRunResult,\n RunRecord,\n RunStatus,\n RunStore,\n} from \"../execution\";\nimport {\n getRun,\n indexRun,\n putRun,\n readList,\n storeKey,\n withTransaction,\n} from \"./cloudflare-store-utils\";\nimport type { CloudflareDurableObjectStorage } from \"./durable-object-storage\";\n\nconst claimableStatuses = new Set<RunStatus>([\n \"leased\",\n \"queued\",\n \"running\",\n \"suspended\",\n]);\n\nexport class DurableObjectRunStore implements RunStore {\n readonly #prefix: string;\n readonly #storage: CloudflareDurableObjectStorage;\n\n constructor(storage: CloudflareDurableObjectStorage, prefix: string) {\n this.#prefix = prefix;\n this.#storage = storage;\n }\n\n async claim(\n runId: string,\n options: ClaimRunOptions\n ): Promise<ClaimRunResult> {\n return await withTransaction(this.#storage, async (storage) => {\n const run = await getRun(storage, this.#prefix, runId);\n if (!run) {\n return { ok: false, reason: \"not-found\" };\n }\n if (!claimableStatuses.has(run.status)) {\n return { ok: false, reason: \"not-claimable\" };\n }\n if (run.lease && run.lease.leaseUntilMs > options.nowMs) {\n return { ok: false, reason: \"leased\" };\n }\n\n const lease = {\n attempt: options.attempt,\n leaseId: options.leaseId,\n leaseUntilMs: options.nowMs + options.leaseMs,\n };\n const claimed: RunRecord = { ...run, lease, status: \"leased\" };\n await putRun(storage, this.#prefix, claimed);\n return { lease, ok: true, record: structuredClone(claimed) };\n });\n }\n\n async create(record: RunRecord): Promise<RunRecord> {\n return await withTransaction(this.#storage, async (storage) => {\n await putRun(storage, this.#prefix, record);\n await indexRun(storage, this.#prefix, record);\n return structuredClone(record);\n });\n }\n\n async get(runId: string): Promise<RunRecord | null> {\n return await getRun(this.#storage, this.#prefix, runId);\n }\n\n async getByDedupeKey(dedupeKey: string): Promise<RunRecord | null> {\n const runId = await this.#storage.get<string>(\n storeKey(this.#prefix, \"run-dedupe\", dedupeKey)\n );\n return runId ? await this.get(runId) : null;\n }\n\n async listByParentRunId(parentRunId: string): Promise<readonly RunRecord[]> {\n const runIds = await readList<string>(\n this.#storage,\n storeKey(this.#prefix, \"run-parent\", parentRunId)\n );\n const runs = await Promise.all(runIds.map((runId) => this.get(runId)));\n return runs.filter(isRunRecord);\n }\n\n async update(record: RunRecord): Promise<RunRecord> {\n return await withTransaction(this.#storage, async (storage) => {\n await putRun(storage, this.#prefix, record);\n await indexRun(storage, this.#prefix, record);\n return structuredClone(record);\n });\n }\n}\n\nfunction isRunRecord(record: RunRecord | null): record is RunRecord {\n return record !== null;\n}\n"],"mappings":";;AAiBA,MAAM,oBAAoB,IAAI,IAAe;CAC3C;CACA;CACA;CACA;AACF,CAAC;AAED,IAAa,wBAAb,MAAuD;CACrD;CACA;CAEA,YAAY,SAAyC,QAAgB;EACnE,KAAKA,UAAU;EACf,KAAKC,WAAW;CAClB;CAEA,MAAM,MACJ,OACA,SACyB;EACzB,OAAO,MAAM,gBAAgB,KAAKA,UAAU,OAAO,YAAY;GAC7D,MAAM,MAAM,MAAM,OAAO,SAAS,KAAKD,SAAS,KAAK;GACrD,IAAI,CAAC,KACH,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAY;GAE1C,IAAI,CAAC,kBAAkB,IAAI,IAAI,MAAM,GACnC,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAgB;GAE9C,IAAI,IAAI,SAAS,IAAI,MAAM,eAAe,QAAQ,OAChD,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAS;GAGvC,MAAM,QAAQ;IACZ,SAAS,QAAQ;IACjB,SAAS,QAAQ;IACjB,cAAc,QAAQ,QAAQ,QAAQ;GACxC;GACA,MAAM,UAAqB;IAAE,GAAG;IAAK;IAAO,QAAQ;GAAS;GAC7D,MAAM,OAAO,SAAS,KAAKA,SAAS,OAAO;GAC3C,OAAO;IAAE;IAAO,IAAI;IAAM,QAAQ,gBAAgB,OAAO;GAAE;EAC7D,CAAC;CACH;CAEA,MAAM,OAAO,QAAuC;EAClD,OAAO,MAAM,gBAAgB,KAAKC,UAAU,OAAO,YAAY;GAC7D,MAAM,OAAO,SAAS,KAAKD,SAAS,MAAM;GAC1C,MAAM,SAAS,SAAS,KAAKA,SAAS,MAAM;GAC5C,OAAO,gBAAgB,MAAM;EAC/B,CAAC;CACH;CAEA,MAAM,IAAI,OAA0C;EAClD,OAAO,MAAM,OAAO,KAAKC,UAAU,KAAKD,SAAS,KAAK;CACxD;CAEA,MAAM,eAAe,WAA8C;EACjE,MAAM,QAAQ,MAAM,KAAKC,SAAS,IAChC,SAAS,KAAKD,SAAS,cAAc,SAAS,CAChD;EACA,OAAO,QAAQ,MAAM,KAAK,IAAI,KAAK,IAAI;CACzC;CAEA,MAAM,kBAAkB,aAAoD;EAC1E,MAAM,SAAS,MAAM,SACnB,KAAKC,UACL,SAAS,KAAKD,SAAS,cAAc,WAAW,CAClD;EAEA,QAAO,MADY,QAAQ,IAAI,OAAO,KAAK,UAAU,KAAK,IAAI,KAAK,CAAC,CAAC,GACzD,OAAO,WAAW;CAChC;CAEA,MAAM,OAAO,QAAuC;EAClD,OAAO,MAAM,gBAAgB,KAAKC,UAAU,OAAO,YAAY;GAC7D,MAAM,OAAO,SAAS,KAAKD,SAAS,MAAM;GAC1C,MAAM,SAAS,SAAS,KAAKA,SAAS,MAAM;GAC5C,OAAO,gBAAgB,MAAM;EAC/B,CAAC;CACH;AACF;AAEA,SAAS,YAAY,QAA+C;CAClE,OAAO,WAAW;AACpB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/cloudflare/cloudflare-store-utils.ts
|
|
2
|
+
async function withTransaction(storage, fn) {
|
|
3
|
+
return storage.transaction ? await storage.transaction(fn) : await fn(storage);
|
|
4
|
+
}
|
|
5
|
+
async function getRun(storage, prefix, runId) {
|
|
6
|
+
return await storage.get(storeKey(prefix, "run", runId)) ?? null;
|
|
7
|
+
}
|
|
8
|
+
async function putRun(storage, prefix, record) {
|
|
9
|
+
await storage.put(storeKey(prefix, "run", record.runId), record);
|
|
10
|
+
}
|
|
11
|
+
async function indexRun(storage, prefix, record) {
|
|
12
|
+
if (record.dedupeKey) await storage.put(storeKey(prefix, "run-dedupe", record.dedupeKey), record.runId);
|
|
13
|
+
if (record.parentRunId) {
|
|
14
|
+
const parentKey = storeKey(prefix, "run-parent", record.parentRunId);
|
|
15
|
+
const runIds = await readList(storage, parentKey);
|
|
16
|
+
if (!runIds.includes(record.runId)) {
|
|
17
|
+
runIds.push(record.runId);
|
|
18
|
+
await storage.put(parentKey, runIds);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function getNotification(storage, prefix, idempotencyKey) {
|
|
23
|
+
return await storage.get(storeKey(prefix, "notification", idempotencyKey)) ?? null;
|
|
24
|
+
}
|
|
25
|
+
async function putNotification(storage, prefix, record) {
|
|
26
|
+
await storage.put(storeKey(prefix, "notification", record.idempotencyKey), record);
|
|
27
|
+
}
|
|
28
|
+
async function getSession(storage, prefix, sessionKey) {
|
|
29
|
+
return await storage.get(storeKey(prefix, "session", sessionKey)) ?? null;
|
|
30
|
+
}
|
|
31
|
+
async function putSession(storage, prefix, sessionKey, session) {
|
|
32
|
+
await storage.put(storeKey(prefix, "session", sessionKey), session);
|
|
33
|
+
}
|
|
34
|
+
async function readList(storage, storageKey) {
|
|
35
|
+
return (await storage.get(storageKey) ?? []).map((item) => structuredClone(item));
|
|
36
|
+
}
|
|
37
|
+
function storeKey(prefix, scope, id) {
|
|
38
|
+
return `${prefix}:${scope}:${encodeURIComponent(id)}`;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { getNotification, getRun, getSession, indexRun, putNotification, putRun, putSession, readList, storeKey, withTransaction };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=cloudflare-store-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-store-utils.js","names":[],"sources":["../../src/cloudflare/cloudflare-store-utils.ts"],"sourcesContent":["import type { NotificationRecord, RunRecord } from \"../execution\";\nimport type { StoredSession } from \"../index\";\nimport type { CloudflareDurableObjectStorage } from \"./durable-object-storage\";\n\nexport async function withTransaction<T>(\n storage: CloudflareDurableObjectStorage,\n fn: (storage: CloudflareDurableObjectStorage) => Promise<T>\n): Promise<T> {\n return storage.transaction\n ? await storage.transaction(fn)\n : await fn(storage);\n}\n\nexport async function getRun(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n runId: string\n): Promise<RunRecord | null> {\n return (await storage.get<RunRecord>(storeKey(prefix, \"run\", runId))) ?? null;\n}\n\nexport async function putRun(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n record: RunRecord\n): Promise<void> {\n await storage.put(storeKey(prefix, \"run\", record.runId), record);\n}\n\nexport async function indexRun(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n record: RunRecord\n): Promise<void> {\n if (record.dedupeKey) {\n await storage.put(\n storeKey(prefix, \"run-dedupe\", record.dedupeKey),\n record.runId\n );\n }\n if (record.parentRunId) {\n const parentKey = storeKey(prefix, \"run-parent\", record.parentRunId);\n const runIds = await readList<string>(storage, parentKey);\n if (!runIds.includes(record.runId)) {\n runIds.push(record.runId);\n await storage.put(parentKey, runIds);\n }\n }\n}\n\nexport async function getNotification(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n idempotencyKey: string\n): Promise<NotificationRecord | null> {\n return (\n (await storage.get<NotificationRecord>(\n storeKey(prefix, \"notification\", idempotencyKey)\n )) ?? null\n );\n}\n\nexport async function putNotification(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n record: NotificationRecord\n): Promise<void> {\n await storage.put(\n storeKey(prefix, \"notification\", record.idempotencyKey),\n record\n );\n}\n\nexport async function getSession(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n sessionKey: string\n): Promise<StoredSession | null> {\n return (\n (await storage.get<StoredSession>(\n storeKey(prefix, \"session\", sessionKey)\n )) ?? null\n );\n}\n\nexport async function putSession(\n storage: CloudflareDurableObjectStorage,\n prefix: string,\n sessionKey: string,\n session: StoredSession\n): Promise<void> {\n await storage.put(storeKey(prefix, \"session\", sessionKey), session);\n}\n\nexport async function readList<T>(\n storage: CloudflareDurableObjectStorage,\n storageKey: string\n): Promise<T[]> {\n return ((await storage.get<readonly T[]>(storageKey)) ?? []).map((item) =>\n structuredClone(item)\n );\n}\n\nexport function storeKey(prefix: string, scope: string, id: string): string {\n return `${prefix}:${scope}:${encodeURIComponent(id)}`;\n}\n"],"mappings":";AAIA,eAAsB,gBACpB,SACA,IACY;CACZ,OAAO,QAAQ,cACX,MAAM,QAAQ,YAAY,EAAE,IAC5B,MAAM,GAAG,OAAO;AACtB;AAEA,eAAsB,OACpB,SACA,QACA,OAC2B;CAC3B,OAAQ,MAAM,QAAQ,IAAe,SAAS,QAAQ,OAAO,KAAK,CAAC,KAAM;AAC3E;AAEA,eAAsB,OACpB,SACA,QACA,QACe;CACf,MAAM,QAAQ,IAAI,SAAS,QAAQ,OAAO,OAAO,KAAK,GAAG,MAAM;AACjE;AAEA,eAAsB,SACpB,SACA,QACA,QACe;CACf,IAAI,OAAO,WACT,MAAM,QAAQ,IACZ,SAAS,QAAQ,cAAc,OAAO,SAAS,GAC/C,OAAO,KACT;CAEF,IAAI,OAAO,aAAa;EACtB,MAAM,YAAY,SAAS,QAAQ,cAAc,OAAO,WAAW;EACnE,MAAM,SAAS,MAAM,SAAiB,SAAS,SAAS;EACxD,IAAI,CAAC,OAAO,SAAS,OAAO,KAAK,GAAG;GAClC,OAAO,KAAK,OAAO,KAAK;GACxB,MAAM,QAAQ,IAAI,WAAW,MAAM;EACrC;CACF;AACF;AAEA,eAAsB,gBACpB,SACA,QACA,gBACoC;CACpC,OACG,MAAM,QAAQ,IACb,SAAS,QAAQ,gBAAgB,cAAc,CACjD,KAAM;AAEV;AAEA,eAAsB,gBACpB,SACA,QACA,QACe;CACf,MAAM,QAAQ,IACZ,SAAS,QAAQ,gBAAgB,OAAO,cAAc,GACtD,MACF;AACF;AAEA,eAAsB,WACpB,SACA,QACA,YAC+B;CAC/B,OACG,MAAM,QAAQ,IACb,SAAS,QAAQ,WAAW,UAAU,CACxC,KAAM;AAEV;AAEA,eAAsB,WACpB,SACA,QACA,YACA,SACe;CACf,MAAM,QAAQ,IAAI,SAAS,QAAQ,WAAW,UAAU,GAAG,OAAO;AACpE;AAEA,eAAsB,SACpB,SACA,YACc;CACd,QAAS,MAAM,QAAQ,IAAkB,UAAU,KAAM,CAAC,GAAG,KAAK,SAChE,gBAAgB,IAAI,CACtB;AACF;AAEA,SAAgB,SAAS,QAAgB,OAAe,IAAoB;CAC1E,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,mBAAmB,EAAE;AACpD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/cloudflare/durable-object-storage.d.ts
|
|
2
|
+
interface CloudflareDurableObjectStorage {
|
|
3
|
+
delete(key: string): Promise<unknown>;
|
|
4
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
5
|
+
put<T>(key: string, value: T): Promise<void>;
|
|
6
|
+
setAlarm?(scheduledTime: Date | number): Promise<void>;
|
|
7
|
+
transaction?<T>(fn: (storage: CloudflareDurableObjectStorage) => Promise<T>): Promise<T>;
|
|
8
|
+
}
|
|
9
|
+
declare class InMemoryCloudflareDurableObjectStorage implements CloudflareDurableObjectStorage {
|
|
10
|
+
#private;
|
|
11
|
+
alarmTime(): Date | number | undefined;
|
|
12
|
+
delete(key: string): Promise<boolean>;
|
|
13
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
14
|
+
put<T>(key: string, value: T): Promise<void>;
|
|
15
|
+
setAlarm(scheduledTime: Date | number): Promise<void>;
|
|
16
|
+
transaction<T>(fn: (storage: CloudflareDurableObjectStorage) => Promise<T>): Promise<T>;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { CloudflareDurableObjectStorage, InMemoryCloudflareDurableObjectStorage };
|
|
20
|
+
//# sourceMappingURL=durable-object-storage.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//#region src/cloudflare/durable-object-storage.ts
|
|
2
|
+
var InMemoryCloudflareDurableObjectStorage = class {
|
|
3
|
+
#alarmTime;
|
|
4
|
+
#transactionChain = Promise.resolve();
|
|
5
|
+
#values = /* @__PURE__ */ new Map();
|
|
6
|
+
alarmTime() {
|
|
7
|
+
return this.#alarmTime;
|
|
8
|
+
}
|
|
9
|
+
delete(key) {
|
|
10
|
+
return Promise.resolve(this.#values.delete(key));
|
|
11
|
+
}
|
|
12
|
+
get(key) {
|
|
13
|
+
const value = this.#values.get(key);
|
|
14
|
+
return Promise.resolve(value === void 0 ? void 0 : structuredClone(value));
|
|
15
|
+
}
|
|
16
|
+
put(key, value) {
|
|
17
|
+
this.#values.set(key, structuredClone(value));
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
setAlarm(scheduledTime) {
|
|
21
|
+
this.#alarmTime = scheduledTime;
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
async transaction(fn) {
|
|
25
|
+
const previousTransaction = this.#transactionChain;
|
|
26
|
+
let releaseTransaction = () => void 0;
|
|
27
|
+
this.#transactionChain = new Promise((resolve) => {
|
|
28
|
+
releaseTransaction = resolve;
|
|
29
|
+
});
|
|
30
|
+
await previousTransaction;
|
|
31
|
+
const transactionValues = cloneMap(this.#values);
|
|
32
|
+
const transactionStorage = new TransactionalCloudflareStorage(transactionValues, (scheduledTime) => {
|
|
33
|
+
this.#alarmTime = scheduledTime;
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
const result = await fn(transactionStorage);
|
|
37
|
+
this.#values = transactionValues;
|
|
38
|
+
return result;
|
|
39
|
+
} finally {
|
|
40
|
+
releaseTransaction();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var TransactionalCloudflareStorage = class {
|
|
45
|
+
#setAlarm;
|
|
46
|
+
#values;
|
|
47
|
+
constructor(values, setAlarm) {
|
|
48
|
+
this.#setAlarm = setAlarm;
|
|
49
|
+
this.#values = values;
|
|
50
|
+
}
|
|
51
|
+
delete(key) {
|
|
52
|
+
return Promise.resolve(this.#values.delete(key));
|
|
53
|
+
}
|
|
54
|
+
get(key) {
|
|
55
|
+
const value = this.#values.get(key);
|
|
56
|
+
return Promise.resolve(value === void 0 ? void 0 : structuredClone(value));
|
|
57
|
+
}
|
|
58
|
+
put(key, value) {
|
|
59
|
+
this.#values.set(key, structuredClone(value));
|
|
60
|
+
return Promise.resolve();
|
|
61
|
+
}
|
|
62
|
+
setAlarm(scheduledTime) {
|
|
63
|
+
this.#setAlarm(scheduledTime);
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
async transaction(fn) {
|
|
67
|
+
return await fn(this);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function cloneMap(values) {
|
|
71
|
+
return new Map([...values.entries()].map(([key, value]) => [key, structuredClone(value)]));
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { InMemoryCloudflareDurableObjectStorage };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=durable-object-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-object-storage.js","names":["#alarmTime","#values","#transactionChain","#setAlarm"],"sources":["../../src/cloudflare/durable-object-storage.ts"],"sourcesContent":["export interface CloudflareDurableObjectStorage {\n delete(key: string): Promise<unknown>;\n get<T>(key: string): Promise<T | undefined>;\n put<T>(key: string, value: T): Promise<void>;\n setAlarm?(scheduledTime: Date | number): Promise<void>;\n transaction?<T>(\n fn: (storage: CloudflareDurableObjectStorage) => Promise<T>\n ): Promise<T>;\n}\n\nexport class InMemoryCloudflareDurableObjectStorage\n implements CloudflareDurableObjectStorage\n{\n #alarmTime: Date | number | undefined;\n #transactionChain: Promise<void> = Promise.resolve();\n #values = new Map<string, unknown>();\n\n alarmTime(): Date | number | undefined {\n return this.#alarmTime;\n }\n\n delete(key: string): Promise<boolean> {\n return Promise.resolve(this.#values.delete(key));\n }\n\n get<T>(key: string): Promise<T | undefined> {\n const value = this.#values.get(key);\n return Promise.resolve(\n value === undefined ? undefined : (structuredClone(value) as T)\n );\n }\n\n put<T>(key: string, value: T): Promise<void> {\n this.#values.set(key, structuredClone(value));\n return Promise.resolve();\n }\n\n setAlarm(scheduledTime: Date | number): Promise<void> {\n this.#alarmTime = scheduledTime;\n return Promise.resolve();\n }\n\n async transaction<T>(\n fn: (storage: CloudflareDurableObjectStorage) => Promise<T>\n ): Promise<T> {\n const previousTransaction = this.#transactionChain;\n let releaseTransaction: () => void = () => undefined;\n this.#transactionChain = new Promise<void>((resolve) => {\n releaseTransaction = resolve;\n });\n await previousTransaction;\n\n const transactionValues = cloneMap(this.#values);\n const transactionStorage = new TransactionalCloudflareStorage(\n transactionValues,\n (scheduledTime) => {\n this.#alarmTime = scheduledTime;\n }\n );\n\n try {\n const result = await fn(transactionStorage);\n this.#values = transactionValues;\n return result;\n } finally {\n releaseTransaction();\n }\n }\n}\n\nclass TransactionalCloudflareStorage implements CloudflareDurableObjectStorage {\n readonly #setAlarm: (scheduledTime: Date | number) => void;\n readonly #values: Map<string, unknown>;\n\n constructor(\n values: Map<string, unknown>,\n setAlarm: (scheduledTime: Date | number) => void\n ) {\n this.#setAlarm = setAlarm;\n this.#values = values;\n }\n\n delete(key: string): Promise<boolean> {\n return Promise.resolve(this.#values.delete(key));\n }\n\n get<T>(key: string): Promise<T | undefined> {\n const value = this.#values.get(key);\n return Promise.resolve(\n value === undefined ? undefined : (structuredClone(value) as T)\n );\n }\n\n put<T>(key: string, value: T): Promise<void> {\n this.#values.set(key, structuredClone(value));\n return Promise.resolve();\n }\n\n setAlarm(scheduledTime: Date | number): Promise<void> {\n this.#setAlarm(scheduledTime);\n return Promise.resolve();\n }\n\n async transaction<T>(\n fn: (storage: CloudflareDurableObjectStorage) => Promise<T>\n ): Promise<T> {\n return await fn(this);\n }\n}\n\nfunction cloneMap(values: Map<string, unknown>): Map<string, unknown> {\n return new Map(\n [...values.entries()].map(([key, value]) => [key, structuredClone(value)])\n );\n}\n"],"mappings":";AAUA,IAAa,yCAAb,MAEA;CACE;CACA,oBAAmC,QAAQ,QAAQ;CACnD,0BAAU,IAAI,IAAqB;CAEnC,YAAuC;EACrC,OAAO,KAAKA;CACd;CAEA,OAAO,KAA+B;EACpC,OAAO,QAAQ,QAAQ,KAAKC,QAAQ,OAAO,GAAG,CAAC;CACjD;CAEA,IAAO,KAAqC;EAC1C,MAAM,QAAQ,KAAKA,QAAQ,IAAI,GAAG;EAClC,OAAO,QAAQ,QACb,UAAU,KAAA,IAAY,KAAA,IAAa,gBAAgB,KAAK,CAC1D;CACF;CAEA,IAAO,KAAa,OAAyB;EAC3C,KAAKA,QAAQ,IAAI,KAAK,gBAAgB,KAAK,CAAC;EAC5C,OAAO,QAAQ,QAAQ;CACzB;CAEA,SAAS,eAA6C;EACpD,KAAKD,aAAa;EAClB,OAAO,QAAQ,QAAQ;CACzB;CAEA,MAAM,YACJ,IACY;EACZ,MAAM,sBAAsB,KAAKE;EACjC,IAAI,2BAAuC,KAAA;EAC3C,KAAKA,oBAAoB,IAAI,SAAe,YAAY;GACtD,qBAAqB;EACvB,CAAC;EACD,MAAM;EAEN,MAAM,oBAAoB,SAAS,KAAKD,OAAO;EAC/C,MAAM,qBAAqB,IAAI,+BAC7B,oBACC,kBAAkB;GACjB,KAAKD,aAAa;EACpB,CACF;EAEA,IAAI;GACF,MAAM,SAAS,MAAM,GAAG,kBAAkB;GAC1C,KAAKC,UAAU;GACf,OAAO;EACT,UAAU;GACR,mBAAmB;EACrB;CACF;AACF;AAEA,IAAM,iCAAN,MAA+E;CAC7E;CACA;CAEA,YACE,QACA,UACA;EACA,KAAKE,YAAY;EACjB,KAAKF,UAAU;CACjB;CAEA,OAAO,KAA+B;EACpC,OAAO,QAAQ,QAAQ,KAAKA,QAAQ,OAAO,GAAG,CAAC;CACjD;CAEA,IAAO,KAAqC;EAC1C,MAAM,QAAQ,KAAKA,QAAQ,IAAI,GAAG;EAClC,OAAO,QAAQ,QACb,UAAU,KAAA,IAAY,KAAA,IAAa,gBAAgB,KAAK,CAC1D;CACF;CAEA,IAAO,KAAa,OAAyB;EAC3C,KAAKA,QAAQ,IAAI,KAAK,gBAAgB,KAAK,CAAC;EAC5C,OAAO,QAAQ,QAAQ;CACzB;CAEA,SAAS,eAA6C;EACpD,KAAKE,UAAU,aAAa;EAC5B,OAAO,QAAQ,QAAQ;CACzB;CAEA,MAAM,YACJ,IACY;EACZ,OAAO,MAAM,GAAG,IAAI;CACtB;AACF;AAEA,SAAS,SAAS,QAAoD;CACpE,OAAO,IAAI,IACT,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAC3E;AACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CloudflareAlarmContinuationReason, CloudflareAlarmDrainBudget, FailedScheduledWork } from "./cloudflare-alarm-budget.js";
|
|
2
|
+
import { CloudflareDurableObjectId, CloudflareDurableObjectNamespace, CloudflareDurableObjectState, CloudflareDurableObjectStorage, CloudflareDurableObjectStub, CloudflareScheduledSessionPrompt, InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm } from "./cloudflare-host.js";
|
|
3
|
+
import { CloudflareAlarmAgent, CloudflareAlarmDrainFailureError, CloudflareAlarmDrainSummary, drainCloudflareAlarm } from "./cloudflare-alarm-drainer.js";
|
|
4
|
+
import { CloudflareAgentContext, CloudflareAgentContextFactoryOptions, CloudflareAgentContextOptions, CloudflareAgentContextPrefixOptions, createCloudflareAgentContext } from "./cloudflare-agent-context.js";
|
|
5
|
+
import { CloudflareAgentRunDrainOptions, drainAgentRun } from "./cloudflare-alarm-run-drain.js";
|
|
6
|
+
import { CloudflareDurableObjectFetchOptions, CloudflareDurableObjectStubOptions, fetchCloudflareDurableObject, getCloudflareDurableObjectStub } from "./cloudflare-durable-object-fetch.js";
|
|
7
|
+
export { type CloudflareAgentContext, type CloudflareAgentContextFactoryOptions, type CloudflareAgentContextOptions, type CloudflareAgentContextPrefixOptions, type CloudflareAgentRunDrainOptions, type CloudflareAlarmAgent, type CloudflareAlarmContinuationReason, type CloudflareAlarmDrainBudget, CloudflareAlarmDrainFailureError, type CloudflareAlarmDrainSummary, type CloudflareDurableObjectFetchOptions, type CloudflareDurableObjectId, type CloudflareDurableObjectNamespace, type CloudflareDurableObjectState, type CloudflareDurableObjectStorage, type CloudflareDurableObjectStub, type CloudflareDurableObjectStubOptions, type CloudflareScheduledSessionPrompt, type FailedScheduledWork, InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAgentContext, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, drainAgentRun, drainCloudflareAlarm, fetchCloudflareDurableObject, getCloudflareDurableObjectStub, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { drainAgentRun } from "./cloudflare-alarm-run-drain.js";
|
|
2
|
+
import { InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm } from "./cloudflare-host.js";
|
|
3
|
+
import { CloudflareAlarmDrainFailureError, drainCloudflareAlarm } from "./cloudflare-alarm-drainer.js";
|
|
4
|
+
import { createCloudflareAgentContext } from "./cloudflare-agent-context.js";
|
|
5
|
+
import { fetchCloudflareDurableObject, getCloudflareDurableObjectStub } from "./cloudflare-durable-object-fetch.js";
|
|
6
|
+
export { CloudflareAlarmDrainFailureError, InMemoryCloudflareDurableObjectStorage, ackScheduledCloudflareRun, ackScheduledCloudflareSessionPrompt, createCloudflareAgentContext, createCloudflareAlarmScheduler, createCloudflareDurableObjectHost, drainAgentRun, drainCloudflareAlarm, fetchCloudflareDurableObject, getCloudflareDurableObjectStub, listScheduledCloudflareRuns, listScheduledCloudflareSessionPrompts, rescheduleCloudflareAlarm };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SessionStore } from "../session/store/types.js";
|
|
2
|
+
import { AgentHostCapabilities, CheckpointStore, EventStore, ExecutionScheduler, ExecutionStore, NotificationInbox, RunStore } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/execution/capabilities.d.ts
|
|
5
|
+
interface SessionHost {
|
|
6
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
7
|
+
readonly sessionStore?: SessionStore;
|
|
8
|
+
}
|
|
9
|
+
interface RunHost {
|
|
10
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
11
|
+
readonly runStore: RunStore;
|
|
12
|
+
}
|
|
13
|
+
interface CheckpointHost {
|
|
14
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
15
|
+
readonly checkpointStore: CheckpointStore;
|
|
16
|
+
}
|
|
17
|
+
interface EventHost {
|
|
18
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
19
|
+
readonly eventStore: EventStore;
|
|
20
|
+
}
|
|
21
|
+
interface NotificationHost {
|
|
22
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
23
|
+
readonly notificationInbox: NotificationInbox;
|
|
24
|
+
}
|
|
25
|
+
type BackgroundScheduler = ExecutionScheduler;
|
|
26
|
+
interface BackgroundSchedulerHost {
|
|
27
|
+
readonly backgroundScheduler: BackgroundScheduler;
|
|
28
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
29
|
+
}
|
|
30
|
+
interface ExecutionTransactionHost {
|
|
31
|
+
readonly capabilities?: AgentHostCapabilities;
|
|
32
|
+
readonly transaction: ExecutionStore["transaction"];
|
|
33
|
+
}
|
|
34
|
+
interface DurableBackgroundHost extends BackgroundSchedulerHost, CheckpointHost, EventHost, ExecutionTransactionHost, NotificationHost, RunHost, SessionHost {
|
|
35
|
+
readonly sessionStore: SessionStore;
|
|
36
|
+
}
|
|
37
|
+
interface DurableNotificationResumeHost extends BackgroundSchedulerHost, CheckpointHost, ExecutionTransactionHost, NotificationHost, RunHost {}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { BackgroundScheduler, BackgroundSchedulerHost, CheckpointHost, DurableBackgroundHost, DurableNotificationResumeHost, EventHost, ExecutionTransactionHost, NotificationHost, RunHost, SessionHost };
|
|
40
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AgentHost, ExecutionHost } from "./types.js";
|
|
2
|
+
import { SessionHost } from "./capabilities.js";
|
|
3
|
+
|
|
4
|
+
//#region src/execution/host.d.ts
|
|
5
|
+
declare function sessionHost(host: AgentHost): SessionHost;
|
|
6
|
+
declare function executionHost(host: AgentHost): ExecutionHost | undefined;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { executionHost, sessionHost };
|
|
9
|
+
//# sourceMappingURL=host.d.ts.map
|