@minpeter/pss-runtime 0.1.0-next.2 → 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.
Files changed (141) hide show
  1. package/README.md +166 -78
  2. package/dist/agent-host-session-store.js +2 -4
  3. package/dist/agent-host-session-store.js.map +1 -1
  4. package/dist/agent-loop.js +2 -3
  5. package/dist/agent-loop.js.map +1 -1
  6. package/dist/agent-namespace.js +3 -7
  7. package/dist/agent-namespace.js.map +1 -1
  8. package/dist/agent-options.d.ts +2 -8
  9. package/dist/agent-options.js +4 -4
  10. package/dist/agent-options.js.map +1 -1
  11. package/dist/agent-resume.js +2 -82
  12. package/dist/agent-resume.js.map +1 -1
  13. package/dist/agent-session-entry.d.ts +1 -1
  14. package/dist/agent.d.ts +4 -4
  15. package/dist/agent.js +16 -70
  16. package/dist/agent.js.map +1 -1
  17. package/dist/cloudflare/cloudflare-agent-context.d.ts +40 -0
  18. package/dist/cloudflare/cloudflare-agent-context.js +37 -0
  19. package/dist/cloudflare/cloudflare-agent-context.js.map +1 -0
  20. package/dist/cloudflare/cloudflare-alarm-budget.d.ts +18 -0
  21. package/dist/cloudflare/cloudflare-alarm-budget.js +77 -0
  22. package/dist/cloudflare/cloudflare-alarm-budget.js.map +1 -0
  23. package/dist/cloudflare/cloudflare-alarm-drainer.d.ts +45 -0
  24. package/dist/cloudflare/cloudflare-alarm-drainer.js +103 -0
  25. package/dist/cloudflare/cloudflare-alarm-drainer.js.map +1 -0
  26. package/dist/cloudflare/cloudflare-alarm-run-drain.d.ts +13 -0
  27. package/dist/cloudflare/cloudflare-alarm-run-drain.js +81 -0
  28. package/dist/cloudflare/cloudflare-alarm-run-drain.js.map +1 -0
  29. package/dist/cloudflare/cloudflare-alarm-work.js +110 -0
  30. package/dist/cloudflare/cloudflare-alarm-work.js.map +1 -0
  31. package/dist/cloudflare/cloudflare-checkpoint-store.js +39 -0
  32. package/dist/cloudflare/cloudflare-checkpoint-store.js.map +1 -0
  33. package/dist/cloudflare/cloudflare-durable-object-fetch.d.ts +21 -0
  34. package/dist/cloudflare/cloudflare-durable-object-fetch.js +11 -0
  35. package/dist/cloudflare/cloudflare-durable-object-fetch.js.map +1 -0
  36. package/dist/cloudflare/cloudflare-event-store.js +33 -0
  37. package/dist/cloudflare/cloudflare-event-store.js.map +1 -0
  38. package/dist/cloudflare/cloudflare-execution-session-store.js +40 -0
  39. package/dist/cloudflare/cloudflare-execution-session-store.js.map +1 -0
  40. package/dist/cloudflare/cloudflare-execution-store.js +35 -0
  41. package/dist/cloudflare/cloudflare-execution-store.js.map +1 -0
  42. package/dist/cloudflare/cloudflare-host.d.ts +61 -0
  43. package/dist/cloudflare/cloudflare-host.js +113 -0
  44. package/dist/cloudflare/cloudflare-host.js.map +1 -0
  45. package/dist/cloudflare/cloudflare-notification-store.js +59 -0
  46. package/dist/cloudflare/cloudflare-notification-store.js.map +1 -0
  47. package/dist/cloudflare/cloudflare-run-store.js +81 -0
  48. package/dist/cloudflare/cloudflare-run-store.js.map +1 -0
  49. package/dist/cloudflare/cloudflare-store-utils.js +43 -0
  50. package/dist/cloudflare/cloudflare-store-utils.js.map +1 -0
  51. package/dist/cloudflare/durable-object-storage.d.ts +20 -0
  52. package/dist/cloudflare/durable-object-storage.js +76 -0
  53. package/dist/cloudflare/durable-object-storage.js.map +1 -0
  54. package/dist/cloudflare/index.d.ts +7 -0
  55. package/dist/cloudflare/index.js +6 -0
  56. package/dist/execution/capabilities.d.ts +40 -0
  57. package/dist/execution/host.d.ts +9 -0
  58. package/dist/execution/host.js +49 -1
  59. package/dist/execution/host.js.map +1 -1
  60. package/dist/execution/index.d.ts +3 -1
  61. package/dist/execution/index.js +2 -1
  62. package/dist/execution/memory.js +1 -1
  63. package/dist/execution/memory.js.map +1 -1
  64. package/dist/execution/types.d.ts +5 -10
  65. package/dist/index.d.ts +8 -4
  66. package/dist/index.js +6 -1
  67. package/dist/plugins.d.ts +25 -3
  68. package/dist/plugins.js +35 -6
  69. package/dist/plugins.js.map +1 -1
  70. package/dist/session/delegate-input.d.ts +9 -0
  71. package/dist/session/delegate-input.js +16 -0
  72. package/dist/session/delegate-input.js.map +1 -0
  73. package/dist/session/events.d.ts +43 -25
  74. package/dist/session/events.js +41 -0
  75. package/dist/session/events.js.map +1 -0
  76. package/dist/session/input-meta-types.d.ts +10 -0
  77. package/dist/session/input-meta.d.ts +13 -0
  78. package/dist/session/input-meta.js +45 -0
  79. package/dist/session/input-meta.js.map +1 -0
  80. package/dist/session/input.d.ts +4 -0
  81. package/dist/session/mapping.js +4 -2
  82. package/dist/session/mapping.js.map +1 -1
  83. package/dist/session/runtime-input-emit.js +41 -0
  84. package/dist/session/runtime-input-emit.js.map +1 -0
  85. package/dist/session/runtime-input.js +5 -1
  86. package/dist/session/runtime-input.js.map +1 -1
  87. package/dist/session/session-events.js +20 -6
  88. package/dist/session/session-events.js.map +1 -1
  89. package/dist/session/session-notification.js +3 -2
  90. package/dist/session/session-notification.js.map +1 -1
  91. package/dist/session/session-runtime-drain.js +3 -9
  92. package/dist/session/session-runtime-drain.js.map +1 -1
  93. package/dist/session/session-turn-processor.js +7 -17
  94. package/dist/session/session-turn-processor.js.map +1 -1
  95. package/dist/session/session.js +11 -4
  96. package/dist/session/session.js.map +1 -1
  97. package/package.json +6 -1
  98. package/dist/agent-child-runs.js +0 -16
  99. package/dist/agent-child-runs.js.map +0 -1
  100. package/dist/agent-host-capabilities.js +0 -9
  101. package/dist/agent-host-capabilities.js.map +0 -1
  102. package/dist/agent-validation.js +0 -35
  103. package/dist/agent-validation.js.map +0 -1
  104. package/dist/child-session-cleanups.js +0 -61
  105. package/dist/child-session-cleanups.js.map +0 -1
  106. package/dist/execution/run.js +0 -55
  107. package/dist/execution/run.js.map +0 -1
  108. package/dist/subagent-background-child-run-state.js +0 -51
  109. package/dist/subagent-background-child-run-state.js.map +0 -1
  110. package/dist/subagent-background-child-run.js +0 -103
  111. package/dist/subagent-background-child-run.js.map +0 -1
  112. package/dist/subagent-background-in-process.js +0 -98
  113. package/dist/subagent-background-in-process.js.map +0 -1
  114. package/dist/subagent-background-notification-inbox.js +0 -106
  115. package/dist/subagent-background-notification-inbox.js.map +0 -1
  116. package/dist/subagent-background-notify.js +0 -136
  117. package/dist/subagent-background-notify.js.map +0 -1
  118. package/dist/subagent-background-resume-group.js +0 -99
  119. package/dist/subagent-background-resume-group.js.map +0 -1
  120. package/dist/subagent-background-runner.js +0 -115
  121. package/dist/subagent-background-runner.js.map +0 -1
  122. package/dist/subagent-background-schedule.js +0 -43
  123. package/dist/subagent-background-schedule.js.map +0 -1
  124. package/dist/subagent-child-run.js +0 -68
  125. package/dist/subagent-child-run.js.map +0 -1
  126. package/dist/subagent-job-cancel.js +0 -84
  127. package/dist/subagent-job-cancel.js.map +0 -1
  128. package/dist/subagent-job-observer.js +0 -19
  129. package/dist/subagent-job-observer.js.map +0 -1
  130. package/dist/subagent-job-output.js +0 -87
  131. package/dist/subagent-job-output.js.map +0 -1
  132. package/dist/subagent-job-state.js +0 -66
  133. package/dist/subagent-job-state.js.map +0 -1
  134. package/dist/subagent-jobs.js +0 -96
  135. package/dist/subagent-jobs.js.map +0 -1
  136. package/dist/subagent-prompt-schema.js +0 -114
  137. package/dist/subagent-prompt-schema.js.map +0 -1
  138. package/dist/subagent-run.js +0 -111
  139. package/dist/subagent-run.js.map +0 -1
  140. package/dist/subagents.js +0 -125
  141. package/dist/subagents.js.map +0 -1
@@ -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
@@ -1,6 +1,22 @@
1
1
  //#region src/execution/host.ts
2
+ function sessionHost(host) {
3
+ const durableHost = durableBackgroundHost(host);
4
+ if (durableHost?.sessionStore) return durableHost;
5
+ const hostExecution = executionHost(host);
6
+ if (hostExecution) return {
7
+ capabilities: hostExecution.capabilities,
8
+ sessionStore: hostExecution.store.sessions
9
+ };
10
+ return host;
11
+ }
2
12
  function executionHost(host) {
3
13
  if (isExecutionHost(host)) return host;
14
+ if (isDurableBackgroundHost(host)) return executionHostFromDurableBackgroundHost(host);
15
+ }
16
+ function durableBackgroundHost(host) {
17
+ if (isDurableBackgroundHost(host)) return host;
18
+ const hostExecution = executionHost(host);
19
+ if (hostExecution) return durableBackgroundHostFromExecutionHost(hostExecution);
4
20
  }
5
21
  function isExecutionHost(host) {
6
22
  return "scheduler" in host && "store" in host && isExecutionStore(host.store);
@@ -8,7 +24,39 @@ function isExecutionHost(host) {
8
24
  function isExecutionStore(store) {
9
25
  return typeof store === "object" && store !== null && "checkpoints" in store && "events" in store && "notifications" in store && "runs" in store && "sessions" in store;
10
26
  }
27
+ function durableBackgroundHostFromExecutionHost(host) {
28
+ return {
29
+ backgroundScheduler: host.scheduler,
30
+ capabilities: host.capabilities,
31
+ checkpointStore: host.store.checkpoints,
32
+ eventStore: host.store.events,
33
+ notificationInbox: host.store.notifications,
34
+ runStore: host.store.runs,
35
+ sessionStore: host.store.sessions,
36
+ transaction: transactionForStore(host.store)
37
+ };
38
+ }
39
+ function executionHostFromDurableBackgroundHost(host) {
40
+ return {
41
+ capabilities: host.capabilities ?? {},
42
+ scheduler: host.backgroundScheduler,
43
+ store: {
44
+ checkpoints: host.checkpointStore,
45
+ events: host.eventStore,
46
+ notifications: host.notificationInbox,
47
+ runs: host.runStore,
48
+ sessions: host.sessionStore,
49
+ transaction: host.transaction
50
+ }
51
+ };
52
+ }
53
+ function isDurableBackgroundHost(host) {
54
+ return "backgroundScheduler" in host && "checkpointStore" in host && "eventStore" in host && "notificationInbox" in host && "runStore" in host && "sessionStore" in host && "transaction" in host;
55
+ }
56
+ function transactionForStore(store) {
57
+ return (fn) => store.transaction(fn);
58
+ }
11
59
  //#endregion
12
- export { executionHost };
60
+ export { executionHost, sessionHost };
13
61
 
14
62
  //# sourceMappingURL=host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","names":[],"sources":["../../src/execution/host.ts"],"sourcesContent":["import type { AgentHost, ExecutionHost } from \"./types\";\n\nexport function executionHost(host: AgentHost): ExecutionHost | undefined {\n if (isExecutionHost(host)) {\n return host;\n }\n\n return;\n}\n\nfunction isExecutionHost(host: AgentHost): host is ExecutionHost {\n return \"scheduler\" in host && \"store\" in host && isExecutionStore(host.store);\n}\n\nfunction isExecutionStore(store: unknown): store is ExecutionHost[\"store\"] {\n return (\n typeof store === \"object\" &&\n store !== null &&\n \"checkpoints\" in store &&\n \"events\" in store &&\n \"notifications\" in store &&\n \"runs\" in store &&\n \"sessions\" in store\n );\n}\n"],"mappings":";AAEA,SAAgB,cAAc,MAA4C;CACxE,IAAI,gBAAgB,IAAI,GACtB,OAAO;AAIX;AAEA,SAAS,gBAAgB,MAAwC;CAC/D,OAAO,eAAe,QAAQ,WAAW,QAAQ,iBAAiB,KAAK,KAAK;AAC9E;AAEA,SAAS,iBAAiB,OAAiD;CACzE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,iBAAiB,SACjB,YAAY,SACZ,mBAAmB,SACnB,UAAU,SACV,cAAc;AAElB"}
1
+ {"version":3,"file":"host.js","names":[],"sources":["../../src/execution/host.ts"],"sourcesContent":["import type {\n DurableBackgroundHost,\n DurableNotificationResumeHost,\n SessionHost,\n} from \"./capabilities\";\nimport type { AgentHost, ExecutionHost } from \"./types\";\n\ntype Transaction = ExecutionHost[\"store\"][\"transaction\"];\n\nexport function sessionHost(host: AgentHost): SessionHost {\n const durableHost = durableBackgroundHost(host);\n if (durableHost?.sessionStore) {\n return durableHost;\n }\n\n const hostExecution = executionHost(host);\n if (hostExecution) {\n return {\n capabilities: hostExecution.capabilities,\n sessionStore: hostExecution.store.sessions,\n };\n }\n\n return host;\n}\n\nexport function executionHost(host: AgentHost): ExecutionHost | undefined {\n if (isExecutionHost(host)) {\n return host;\n }\n\n if (isDurableBackgroundHost(host)) {\n return executionHostFromDurableBackgroundHost(host);\n }\n\n return;\n}\n\nexport function durableBackgroundHost(\n host: AgentHost\n): DurableBackgroundHost | undefined {\n if (isDurableBackgroundHost(host)) {\n return host;\n }\n\n const hostExecution = executionHost(host);\n if (hostExecution) {\n return durableBackgroundHostFromExecutionHost(hostExecution);\n }\n\n return;\n}\n\nexport function durableNotificationResumeHost(\n host: AgentHost\n): DurableNotificationResumeHost | undefined {\n const backgroundHost = durableBackgroundHost(host);\n if (backgroundHost) {\n return backgroundHost;\n }\n\n return;\n}\n\nfunction isExecutionHost(host: AgentHost): host is ExecutionHost {\n return \"scheduler\" in host && \"store\" in host && isExecutionStore(host.store);\n}\n\nfunction isExecutionStore(store: unknown): store is ExecutionHost[\"store\"] {\n return (\n typeof store === \"object\" &&\n store !== null &&\n \"checkpoints\" in store &&\n \"events\" in store &&\n \"notifications\" in store &&\n \"runs\" in store &&\n \"sessions\" in store\n );\n}\n\nfunction durableBackgroundHostFromExecutionHost(\n host: ExecutionHost\n): DurableBackgroundHost {\n return {\n backgroundScheduler: host.scheduler,\n capabilities: host.capabilities,\n checkpointStore: host.store.checkpoints,\n eventStore: host.store.events,\n notificationInbox: host.store.notifications,\n runStore: host.store.runs,\n sessionStore: host.store.sessions,\n transaction: transactionForStore(host.store),\n };\n}\n\nfunction executionHostFromDurableBackgroundHost(\n host: DurableBackgroundHost\n): ExecutionHost {\n return {\n capabilities: host.capabilities ?? {},\n scheduler: host.backgroundScheduler,\n store: {\n checkpoints: host.checkpointStore,\n events: host.eventStore,\n notifications: host.notificationInbox,\n runs: host.runStore,\n sessions: host.sessionStore,\n transaction: host.transaction,\n },\n };\n}\n\nfunction isDurableBackgroundHost(\n host: AgentHost\n): host is DurableBackgroundHost {\n return (\n \"backgroundScheduler\" in host &&\n \"checkpointStore\" in host &&\n \"eventStore\" in host &&\n \"notificationInbox\" in host &&\n \"runStore\" in host &&\n \"sessionStore\" in host &&\n \"transaction\" in host\n );\n}\n\nfunction transactionForStore(store: ExecutionHost[\"store\"]): Transaction {\n return (fn) => store.transaction(fn);\n}\n"],"mappings":";AASA,SAAgB,YAAY,MAA8B;CACxD,MAAM,cAAc,sBAAsB,IAAI;CAC9C,IAAI,aAAa,cACf,OAAO;CAGT,MAAM,gBAAgB,cAAc,IAAI;CACxC,IAAI,eACF,OAAO;EACL,cAAc,cAAc;EAC5B,cAAc,cAAc,MAAM;CACpC;CAGF,OAAO;AACT;AAEA,SAAgB,cAAc,MAA4C;CACxE,IAAI,gBAAgB,IAAI,GACtB,OAAO;CAGT,IAAI,wBAAwB,IAAI,GAC9B,OAAO,uCAAuC,IAAI;AAItD;AAEA,SAAgB,sBACd,MACmC;CACnC,IAAI,wBAAwB,IAAI,GAC9B,OAAO;CAGT,MAAM,gBAAgB,cAAc,IAAI;CACxC,IAAI,eACF,OAAO,uCAAuC,aAAa;AAI/D;AAaA,SAAS,gBAAgB,MAAwC;CAC/D,OAAO,eAAe,QAAQ,WAAW,QAAQ,iBAAiB,KAAK,KAAK;AAC9E;AAEA,SAAS,iBAAiB,OAAiD;CACzE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,iBAAiB,SACjB,YAAY,SACZ,mBAAmB,SACnB,UAAU,SACV,cAAc;AAElB;AAEA,SAAS,uCACP,MACuB;CACvB,OAAO;EACL,qBAAqB,KAAK;EAC1B,cAAc,KAAK;EACnB,iBAAiB,KAAK,MAAM;EAC5B,YAAY,KAAK,MAAM;EACvB,mBAAmB,KAAK,MAAM;EAC9B,UAAU,KAAK,MAAM;EACrB,cAAc,KAAK,MAAM;EACzB,aAAa,oBAAoB,KAAK,KAAK;CAC7C;AACF;AAEA,SAAS,uCACP,MACe;CACf,OAAO;EACL,cAAc,KAAK,gBAAgB,CAAC;EACpC,WAAW,KAAK;EAChB,OAAO;GACL,aAAa,KAAK;GAClB,QAAQ,KAAK;GACb,eAAe,KAAK;GACpB,MAAM,KAAK;GACX,UAAU,KAAK;GACf,aAAa,KAAK;EACpB;CACF;AACF;AAEA,SAAS,wBACP,MAC+B;CAC/B,OACE,yBAAyB,QACzB,qBAAqB,QACrB,gBAAgB,QAChB,uBAAuB,QACvB,cAAc,QACd,kBAAkB,QAClB,iBAAiB;AAErB;AAEA,SAAS,oBAAoB,OAA4C;CACvE,QAAQ,OAAO,MAAM,YAAY,EAAE;AACrC"}
@@ -1,4 +1,6 @@
1
1
  import { RuntimeToolExecutionCheckpoint, RuntimeToolExecutionContext, RuntimeToolExecutionDecision, RuntimeToolRetryPolicy, ToolExecutionNeedsRecoveryError } from "../llm-tool-execution.js";
2
2
  import { AgentHostCapabilities, CheckpointPhase, CheckpointStore, CheckpointWriteResult, ClaimRunOptions, ClaimRunResult, EventCursor, EventStore, ExecutionHost, ExecutionScheduler, ExecutionStore, ExecutionStoreTransaction, NotificationClaimResult, NotificationInbox, NotificationRecord, NotificationStatus, NotificationWriteResult, ResumeSessionOptions, RunCheckpoint, RunKind, RunLease, RunRecord, RunStatus, RunStore, StoredAgentEvent } from "./types.js";
3
+ import { BackgroundScheduler, BackgroundSchedulerHost, CheckpointHost, DurableBackgroundHost, DurableNotificationResumeHost, EventHost, ExecutionTransactionHost, NotificationHost, RunHost, SessionHost } from "./capabilities.js";
4
+ import { executionHost, sessionHost } from "./host.js";
3
5
  import { createInMemoryExecutionHost } from "./memory.js";
4
- export { type AgentHostCapabilities, type CheckpointPhase, type CheckpointStore, type CheckpointWriteResult, type ClaimRunOptions, type ClaimRunResult, type EventCursor, type EventStore, type ExecutionHost, type ExecutionScheduler, type ExecutionStore, type ExecutionStoreTransaction, type NotificationClaimResult, type NotificationInbox, type NotificationRecord, type NotificationStatus, type NotificationWriteResult, type ResumeSessionOptions, type RunCheckpoint, type RunKind, type RunLease, type RunRecord, type RunStatus, type RunStore, type RuntimeToolExecutionCheckpoint, type RuntimeToolExecutionContext, type RuntimeToolExecutionDecision, type RuntimeToolRetryPolicy, type StoredAgentEvent, ToolExecutionNeedsRecoveryError, createInMemoryExecutionHost };
6
+ export { type AgentHostCapabilities, type BackgroundScheduler, type BackgroundSchedulerHost, type CheckpointHost, type CheckpointPhase, type CheckpointStore, type CheckpointWriteResult, type ClaimRunOptions, type ClaimRunResult, type DurableBackgroundHost, type DurableNotificationResumeHost, type EventCursor, type EventHost, type EventStore, type ExecutionHost, type ExecutionScheduler, type ExecutionStore, type ExecutionStoreTransaction, type ExecutionTransactionHost, type NotificationClaimResult, type NotificationHost, type NotificationInbox, type NotificationRecord, type NotificationStatus, type NotificationWriteResult, type ResumeSessionOptions, type RunCheckpoint, type RunHost, type RunKind, type RunLease, type RunRecord, type RunStatus, type RunStore, type RuntimeToolExecutionCheckpoint, type RuntimeToolExecutionContext, type RuntimeToolExecutionDecision, type RuntimeToolRetryPolicy, type SessionHost, type StoredAgentEvent, ToolExecutionNeedsRecoveryError, createInMemoryExecutionHost, executionHost, sessionHost };
@@ -1,3 +1,4 @@
1
+ import { executionHost, sessionHost } from "./host.js";
1
2
  import { createInMemoryExecutionHost } from "./memory.js";
2
3
  import { ToolExecutionNeedsRecoveryError } from "../llm-tool-execution.js";
3
- export { ToolExecutionNeedsRecoveryError, createInMemoryExecutionHost };
4
+ export { ToolExecutionNeedsRecoveryError, createInMemoryExecutionHost, executionHost, sessionHost };
@@ -2,7 +2,7 @@ import { InMemoryExecutionStore } from "./memory-store.js";
2
2
  //#region src/execution/memory.ts
3
3
  function createInMemoryExecutionHost() {
4
4
  return {
5
- capabilities: { backgroundSubagents: "in-process" },
5
+ capabilities: {},
6
6
  store: new InMemoryExecutionStore(),
7
7
  scheduler: new InMemoryExecutionScheduler()
8
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","names":["#queuedRunIds","#resumedSessions"],"sources":["../../src/execution/memory.ts"],"sourcesContent":["import { InMemoryExecutionStore } from \"./memory-store\";\nimport type {\n ExecutionHost,\n ExecutionScheduler,\n ResumeSessionOptions,\n} from \"./types\";\n\nexport function createInMemoryExecutionHost(): ExecutionHost {\n return {\n capabilities: {\n backgroundSubagents: \"in-process\",\n },\n store: new InMemoryExecutionStore(),\n scheduler: new InMemoryExecutionScheduler(),\n };\n}\n\nclass InMemoryExecutionScheduler implements ExecutionScheduler {\n readonly #queuedRunIds: string[] = [];\n readonly #resumedSessions: {\n readonly options: ResumeSessionOptions;\n readonly sessionKey: string;\n }[] = [];\n\n enqueueRun(runId: string): Promise<void> {\n this.#queuedRunIds.push(runId);\n return Promise.resolve();\n }\n\n resumeSession(\n sessionKey: string,\n options: ResumeSessionOptions\n ): Promise<void> {\n this.#resumedSessions.push({ options, sessionKey });\n return Promise.resolve();\n }\n}\n"],"mappings":";;AAOA,SAAgB,8BAA6C;CAC3D,OAAO;EACL,cAAc,EACZ,qBAAqB,aACvB;EACA,OAAO,IAAI,uBAAuB;EAClC,WAAW,IAAI,2BAA2B;CAC5C;AACF;AAEA,IAAM,6BAAN,MAA+D;CAC7D,gBAAmC,CAAC;CACpC,mBAGM,CAAC;CAEP,WAAW,OAA8B;EACvC,KAAKA,cAAc,KAAK,KAAK;EAC7B,OAAO,QAAQ,QAAQ;CACzB;CAEA,cACE,YACA,SACe;EACf,KAAKC,iBAAiB,KAAK;GAAE;GAAS;EAAW,CAAC;EAClD,OAAO,QAAQ,QAAQ;CACzB;AACF"}
1
+ {"version":3,"file":"memory.js","names":["#queuedRunIds","#resumedSessions"],"sources":["../../src/execution/memory.ts"],"sourcesContent":["import { InMemoryExecutionStore } from \"./memory-store\";\nimport type {\n ExecutionHost,\n ExecutionScheduler,\n ResumeSessionOptions,\n} from \"./types\";\n\nexport function createInMemoryExecutionHost(): ExecutionHost {\n return {\n capabilities: {},\n store: new InMemoryExecutionStore(),\n scheduler: new InMemoryExecutionScheduler(),\n };\n}\n\nclass InMemoryExecutionScheduler implements ExecutionScheduler {\n readonly #queuedRunIds: string[] = [];\n readonly #resumedSessions: {\n readonly options: ResumeSessionOptions;\n readonly sessionKey: string;\n }[] = [];\n\n enqueueRun(runId: string): Promise<void> {\n this.#queuedRunIds.push(runId);\n return Promise.resolve();\n }\n\n resumeSession(\n sessionKey: string,\n options: ResumeSessionOptions\n ): Promise<void> {\n this.#resumedSessions.push({ options, sessionKey });\n return Promise.resolve();\n }\n}\n"],"mappings":";;AAOA,SAAgB,8BAA6C;CAC3D,OAAO;EACL,cAAc,CAAC;EACf,OAAO,IAAI,uBAAuB;EAClC,WAAW,IAAI,2BAA2B;CAC5C;AACF;AAEA,IAAM,6BAAN,MAA+D;CAC7D,gBAAmC,CAAC;CACpC,mBAGM,CAAC;CAEP,WAAW,OAA8B;EACvC,KAAKA,cAAc,KAAK,KAAK;EAC7B,OAAO,QAAQ,QAAQ;CACzB;CAEA,cACE,YACA,SACe;EACf,KAAKC,iBAAiB,KAAK;GAAE;GAAS;EAAW,CAAC;EAClD,OAAO,QAAQ,QAAQ;CACzB;AACF"}
@@ -1,21 +1,16 @@
1
+ import { SessionStore } from "../session/store/types.js";
1
2
  import { UserInput } from "../session/input.js";
2
3
  import { AgentEvent } from "../session/events.js";
3
- import { SessionStore } from "../session/store/types.js";
4
+ import { DurableBackgroundHost, SessionHost } from "./capabilities.js";
4
5
 
5
6
  //#region src/execution/types.d.ts
6
- type AgentHost = SessionHost | ExecutionHost;
7
- interface SessionHost {
8
- readonly capabilities?: AgentHostCapabilities;
9
- readonly sessionStore?: SessionStore;
10
- }
7
+ type AgentHost = DurableBackgroundHost | ExecutionHost | SessionHost;
11
8
  interface ExecutionHost {
12
9
  readonly capabilities: AgentHostCapabilities;
13
10
  readonly scheduler: ExecutionScheduler;
14
11
  readonly store: ExecutionStore;
15
12
  }
16
- interface AgentHostCapabilities {
17
- readonly backgroundSubagents?: "durable" | "in-process";
18
- }
13
+ type AgentHostCapabilities = Record<string, never>;
19
14
  interface ExecutionScheduler {
20
15
  enqueueRun(runId: string, options?: {
21
16
  readonly runAfterMs?: number;
@@ -27,7 +22,7 @@ interface ResumeSessionOptions {
27
22
  readonly notificationId?: string;
28
23
  readonly runId: string;
29
24
  }
30
- type RunKind = "background-subagent" | "notification" | "subagent" | "tool-recovery" | "user-turn";
25
+ type RunKind = "notification" | "tool-recovery" | "user-turn";
31
26
  type RunStatus = "cancelled" | "completed" | "error" | "leased" | "needs-recovery" | "queued" | "running" | "suspended";
32
27
  interface RunLease {
33
28
  readonly attempt: number;
package/dist/index.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import { AgentToolChoice, RuntimeCreateLlmOptions, RuntimeLlm, RuntimeLlmContext, RuntimeLlmOutput, RuntimeLlmOutputPart, createLlm } from "./llm.js";
2
- import { AgentInput, SessionInput, UserInput, UserMessage, UserMessageContent, UserMessageContentPart, UserMessageFileData, UserMessageFilePart, UserMessageImagePart, UserMessageTextPart, UserText, UserTextContent } from "./session/input.js";
3
- import { AgentEvent, AgentEventListener, AssistantReasoning, AssistantText, RuntimeInput, ToolCall, ToolResult } from "./session/events.js";
4
2
  import { CommitResult, ExpectedSessionVersion, SessionStore, SessionStoreCommit, StoredSession } from "./session/store/types.js";
3
+ import { InputEventMeta, InputSource } from "./session/input-meta-types.js";
4
+ import { AgentInput, SessionInput, UserInput, UserMessage, UserMessageContent, UserMessageContentPart, UserMessageFileData, UserMessageFilePart, UserMessageImagePart, UserMessageTextPart, UserText, UserTextContent } from "./session/input.js";
5
+ import { AgentEvent, AgentEventListener, AssistantReasoning, AssistantText, ControlAgentEvent, LifecycleAgentEvent, RuntimeInput, TelemetryAgentEvent, ToolAgentEvent, ToolCall, ToolResult, VisibleAgentEvent, isControlAgentEvent, isLifecycleAgentEvent, isTelemetryAgentEvent, isToolAgentEvent, isVisibleAgentEvent } from "./session/events.js";
5
6
  import { AgentHost } from "./execution/types.js";
6
- import { AgentEventContext, AgentPlugin } from "./plugins.js";
7
+ import { executionHost } from "./execution/host.js";
8
+ import { AgentEventContext, AgentPlugin, AgentPluginInterceptResult, AgentPluginResult, InterceptableAgentEvent, PluginPipelineResult, runPluginsForEvent } from "./plugins.js";
7
9
  import { AgentOptions } from "./agent-options.js";
8
10
  import { AgentRun } from "./session/run.js";
9
11
  import { SessionHandle } from "./agent-session-entry.js";
10
12
  import { Agent } from "./agent.js";
11
- export { Agent, type AgentEvent, type AgentEventContext, type AgentEventListener, type AgentHost, type AgentInput, type AgentOptions, type AgentPlugin, type AgentRun, type AgentToolChoice, type AssistantReasoning, type AssistantText, type CommitResult, type ExpectedSessionVersion, type RuntimeCreateLlmOptions, type RuntimeInput, type RuntimeLlm, type RuntimeLlmContext, type RuntimeLlmOutput, type RuntimeLlmOutputPart, type SessionHandle, type SessionInput, type SessionStore, type SessionStoreCommit, type StoredSession, type ToolCall, type ToolResult, type UserInput, type UserMessage, type UserMessageContent, type UserMessageContentPart, type UserMessageFileData, type UserMessageFilePart, type UserMessageImagePart, type UserMessageTextPart, type UserText, type UserTextContent, createLlm };
13
+ import { delegateUserInput } from "./session/delegate-input.js";
14
+ import { attachInputMeta, attachRuntimeInputMeta, stripEventMeta, stripInputMeta, userInputFromEvent } from "./session/input-meta.js";
15
+ export { Agent, type AgentEvent, type AgentEventContext, type AgentEventListener, type AgentHost, type AgentInput, type AgentOptions, type AgentPlugin, type AgentPluginInterceptResult, type AgentPluginResult, type AgentRun, type AgentToolChoice, type AssistantReasoning, type AssistantText, type CommitResult, type ControlAgentEvent, type ExpectedSessionVersion, type InputEventMeta, type InputSource, type InterceptableAgentEvent, type LifecycleAgentEvent, type PluginPipelineResult, type RuntimeCreateLlmOptions, type RuntimeInput, type RuntimeLlm, type RuntimeLlmContext, type RuntimeLlmOutput, type RuntimeLlmOutputPart, type SessionHandle, type SessionInput, type SessionStore, type SessionStoreCommit, type StoredSession, type TelemetryAgentEvent, type ToolAgentEvent, type ToolCall, type ToolResult, type UserInput, type UserMessage, type UserMessageContent, type UserMessageContentPart, type UserMessageFileData, type UserMessageFilePart, type UserMessageImagePart, type UserMessageTextPart, type UserText, type UserTextContent, type VisibleAgentEvent, attachInputMeta, attachRuntimeInputMeta, createLlm, delegateUserInput, executionHost, isControlAgentEvent, isLifecycleAgentEvent, isTelemetryAgentEvent, isToolAgentEvent, isVisibleAgentEvent, runPluginsForEvent, stripEventMeta, stripInputMeta, userInputFromEvent };
package/dist/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ import { executionHost } from "./execution/host.js";
1
2
  import { createLlm } from "./llm.js";
3
+ import { attachInputMeta, attachRuntimeInputMeta, stripEventMeta, stripInputMeta, userInputFromEvent } from "./session/input-meta.js";
4
+ import { runPluginsForEvent } from "./plugins.js";
2
5
  import { Agent } from "./agent.js";
3
- export { Agent, createLlm };
6
+ import { delegateUserInput } from "./session/delegate-input.js";
7
+ import { isControlAgentEvent, isLifecycleAgentEvent, isTelemetryAgentEvent, isToolAgentEvent, isVisibleAgentEvent } from "./session/events.js";
8
+ export { Agent, attachInputMeta, attachRuntimeInputMeta, createLlm, delegateUserInput, executionHost, isControlAgentEvent, isLifecycleAgentEvent, isTelemetryAgentEvent, isToolAgentEvent, isVisibleAgentEvent, runPluginsForEvent, stripEventMeta, stripInputMeta, userInputFromEvent };