@opengeni/worker-bundle 1.0.0-canary.1 → 1.0.0

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 (244) hide show
  1. package/dist/activities/agent-run-admission.d.ts +3 -1
  2. package/dist/activities/agent-turn/admission.d.ts +24 -3
  3. package/dist/activities/agent-turn/agent-build.d.ts +4 -0
  4. package/dist/activities/agent-turn/claude-usage-observer.d.ts +58 -0
  5. package/dist/activities/agent-turn/code-search.d.ts +60 -0
  6. package/dist/activities/agent-turn/codex-capacity.d.ts +13 -0
  7. package/dist/activities/agent-turn/codex-plan-entitlement.d.ts +105 -0
  8. package/dist/activities/agent-turn/codex.d.ts +3 -2
  9. package/dist/activities/agent-turn/compaction-prep.d.ts +21 -5
  10. package/dist/activities/agent-turn/credential-leases.d.ts +19 -33
  11. package/dist/activities/agent-turn/credential-restriction.d.ts +3 -0
  12. package/dist/activities/agent-turn/errors.d.ts +82 -11
  13. package/dist/activities/agent-turn/failure-settlement.d.ts +6 -3
  14. package/dist/activities/agent-turn/final-reply.d.ts +18 -0
  15. package/dist/activities/agent-turn/finalization-monitor.d.ts +17 -0
  16. package/dist/activities/agent-turn/finalization.d.ts +4 -2
  17. package/dist/activities/agent-turn/github-repository-bindings.d.ts +2 -0
  18. package/dist/activities/agent-turn/governance-model.d.ts +9 -2
  19. package/dist/activities/agent-turn/history-sink.d.ts +2 -0
  20. package/dist/activities/agent-turn/history.d.ts +2 -0
  21. package/dist/activities/agent-turn/input-wait-reply.d.ts +41 -0
  22. package/dist/activities/agent-turn/media-artifacts.d.ts +5 -3
  23. package/dist/activities/agent-turn/model-call-admission.d.ts +15 -0
  24. package/dist/activities/agent-turn/model-usage.d.ts +6 -0
  25. package/dist/activities/agent-turn/model-wire-dispatch.d.ts +15 -0
  26. package/dist/activities/agent-turn/optional-repositories.d.ts +59 -0
  27. package/dist/activities/agent-turn/provider-dispatch-barrier.d.ts +12 -1
  28. package/dist/activities/agent-turn/quiescence.d.ts +7 -7
  29. package/dist/activities/agent-turn/recovery-warning.d.ts +9 -0
  30. package/dist/activities/agent-turn/refresh-credentials.d.ts +6 -0
  31. package/dist/activities/agent-turn/run-credentials.d.ts +8 -3
  32. package/dist/activities/agent-turn/sandbox-establish.d.ts +2 -1
  33. package/dist/activities/agent-turn/sandbox-provision.d.ts +3 -1
  34. package/dist/activities/agent-turn/sandbox-route.d.ts +3 -20
  35. package/dist/activities/agent-turn/sandbox-runtime.d.ts +2 -2
  36. package/dist/activities/agent-turn/session-title.d.ts +34 -2
  37. package/dist/activities/agent-turn/skill-checkout.d.ts +25 -6
  38. package/dist/activities/agent-turn/skill-read.d.ts +70 -2
  39. package/dist/activities/agent-turn/skill-remove.d.ts +14 -0
  40. package/dist/activities/agent-turn/skill-search.d.ts +3 -1
  41. package/dist/activities/agent-turn/skill-tools.d.ts +15 -2
  42. package/dist/activities/agent-turn/skill-transfer.d.ts +18 -6
  43. package/dist/activities/agent-turn/stream-attempt.d.ts +7 -3
  44. package/dist/activities/agent-turn/subscription-lease.d.ts +38 -0
  45. package/dist/activities/agent-turn/tool-environment.d.ts +56 -6
  46. package/dist/activities/agent-turn/tool-policy.d.ts +43 -0
  47. package/dist/activities/agent-turn/turn-context.d.ts +29 -0
  48. package/dist/activities/agent-turn/turn-sandbox-access.d.ts +3 -0
  49. package/dist/activities/agent-turn/xai-capacity.d.ts +2 -1
  50. package/dist/activities/automations.d.ts +3 -1
  51. package/dist/activities/browser-deadline-checkpoint.d.ts +29 -0
  52. package/dist/activities/codemode-dispatcher.d.ts +9 -2
  53. package/dist/activities/codex-capacity.d.ts +18 -2
  54. package/dist/activities/codex-rotation.d.ts +7 -1
  55. package/dist/activities/context-compaction.d.ts +16 -2
  56. package/dist/activities/gmail-files.d.ts +32 -0
  57. package/dist/activities/goals.d.ts +8 -0
  58. package/dist/activities/knowledge-indexing.d.ts +19 -0
  59. package/dist/activities/mcp-account-routes.d.ts +3 -0
  60. package/dist/activities/mcp-credentials.d.ts +12 -13
  61. package/dist/activities/mcp-operation-authority.d.ts +0 -5
  62. package/dist/activities/model-call-fact-reconciler.d.ts +34 -0
  63. package/dist/activities/open-suffix-resume.d.ts +13 -0
  64. package/dist/activities/parent-wake.d.ts +6 -12
  65. package/dist/activities/retained-screenshots.d.ts +7 -2
  66. package/dist/activities/rig-verification.d.ts +2 -3
  67. package/dist/activities/run-credential-renewal.d.ts +1 -0
  68. package/dist/activities/run-credentials.d.ts +15 -3
  69. package/dist/activities/sandbox-images.d.ts +1 -1
  70. package/dist/activities/sandbox-lease.d.ts +47 -9
  71. package/dist/activities/scheduled-tasks.d.ts +4 -35
  72. package/dist/activities/session-state.d.ts +70 -3
  73. package/dist/activities/types.d.ts +55 -6
  74. package/dist/activities/workspace-capture.d.ts +2 -0
  75. package/dist/activities/workspace-credential-provider.d.ts +46 -0
  76. package/dist/{activities-control-HMFGSKC5.js → activities-control-BNPTRTOE.js} +1896 -418
  77. package/dist/activities-control-BNPTRTOE.js.map +1 -0
  78. package/dist/activities-control.d.ts +182 -4
  79. package/dist/{activities-turn-AP67JADS.js → activities-turn-5LGZOSVU.js} +4476 -1327
  80. package/dist/activities-turn-5LGZOSVU.js.map +1 -0
  81. package/dist/activities.d.ts +182 -4
  82. package/dist/artifact-materializer-entry.js +5 -2
  83. package/dist/artifact-materializer-entry.js.map +1 -1
  84. package/dist/artifact-outbox-entry.js +5 -2
  85. package/dist/artifact-outbox-entry.js.map +1 -1
  86. package/dist/browser-deadline-checkpoint-contract.d.ts +2 -0
  87. package/dist/{chunk-A4XQWVZK.js → chunk-3ZTRWDMN.js} +307 -4
  88. package/dist/chunk-3ZTRWDMN.js.map +1 -0
  89. package/dist/{chunk-RAMNYSAW.js → chunk-4ER3YXOT.js} +22 -4
  90. package/dist/chunk-4ER3YXOT.js.map +1 -0
  91. package/dist/{chunk-CYITU5UH.js → chunk-LJX7Z2KP.js} +1445 -343
  92. package/dist/chunk-LJX7Z2KP.js.map +1 -0
  93. package/dist/editable-artifact-materializer-service.d.ts +2 -2
  94. package/dist/editable-artifact-outbox-service.d.ts +2 -2
  95. package/dist/host-export-pump.d.ts +3 -1
  96. package/dist/host-export.d.ts +1 -1
  97. package/dist/host-export.js +1 -1
  98. package/dist/http.d.ts +1 -1
  99. package/dist/index.d.ts +95 -3
  100. package/dist/index.js +137 -43
  101. package/dist/index.js.map +1 -1
  102. package/dist/observability-metrics.d.ts +118 -8
  103. package/dist/retained-process-diagnostics.d.ts +4 -0
  104. package/dist/retained-process-retry.d.ts +7 -0
  105. package/dist/sandbox-resume.d.ts +55 -13
  106. package/dist/sandbox-routing.d.ts +5 -3
  107. package/dist/sandbox-snapshot-diagnostics.d.ts +20 -0
  108. package/dist/session-event-fanout.d.ts +6 -0
  109. package/dist/warm-capture-holder.d.ts +3 -0
  110. package/dist/worker-service-lifecycle.d.ts +12 -0
  111. package/dist/workflow-bundle.js +273 -41
  112. package/dist/workflows/activities.d.ts +1 -1
  113. package/dist/workflows/browser-deadline-checkpoint.d.ts +9 -0
  114. package/dist/workflows/scheduled-tasks.d.ts +4 -0
  115. package/dist/workflows/session.d.ts +36 -0
  116. package/dist/workflows.d.ts +1 -0
  117. package/package.json +21 -19
  118. package/src/activities/agent-run-admission.ts +17 -1
  119. package/src/activities/agent-turn/admission.ts +66 -3
  120. package/src/activities/agent-turn/agent-build.ts +84 -10
  121. package/src/activities/agent-turn/claim.ts +186 -43
  122. package/src/activities/agent-turn/claude-usage-observer.ts +221 -0
  123. package/src/activities/agent-turn/code-search.ts +275 -0
  124. package/src/activities/agent-turn/codex-capacity.ts +172 -8
  125. package/src/activities/agent-turn/codex-plan-entitlement.ts +254 -0
  126. package/src/activities/agent-turn/codex.ts +13 -5
  127. package/src/activities/agent-turn/compaction-prep.ts +170 -102
  128. package/src/activities/agent-turn/credential-leases.ts +122 -216
  129. package/src/activities/agent-turn/credential-restriction.ts +14 -0
  130. package/src/activities/agent-turn/errors.ts +647 -48
  131. package/src/activities/agent-turn/failure-settlement.ts +682 -130
  132. package/src/activities/agent-turn/final-reply.ts +46 -0
  133. package/src/activities/agent-turn/finalization-monitor.ts +120 -0
  134. package/src/activities/agent-turn/finalization.ts +146 -43
  135. package/src/activities/agent-turn/github-repository-bindings.ts +3 -1
  136. package/src/activities/agent-turn/governance-model.ts +69 -28
  137. package/src/activities/agent-turn/history-sink.ts +16 -2
  138. package/src/activities/agent-turn/history.ts +38 -11
  139. package/src/activities/agent-turn/input-wait-reply.ts +103 -0
  140. package/src/activities/agent-turn/knowledge-source-tools.ts +2 -0
  141. package/src/activities/agent-turn/media-artifacts.ts +2 -1
  142. package/src/activities/agent-turn/model-call-admission.ts +94 -0
  143. package/src/activities/agent-turn/model-usage.ts +64 -3
  144. package/src/activities/agent-turn/model-wire-dispatch.ts +27 -0
  145. package/src/activities/agent-turn/optional-repositories.ts +224 -0
  146. package/src/activities/agent-turn/provider-dispatch-barrier.ts +22 -0
  147. package/src/activities/agent-turn/quiescence.ts +10 -7
  148. package/src/activities/agent-turn/recovery-warning.ts +16 -0
  149. package/src/activities/agent-turn/refresh-credentials.ts +44 -0
  150. package/src/activities/agent-turn/run-credentials.ts +116 -55
  151. package/src/activities/agent-turn/run.ts +320 -93
  152. package/src/activities/agent-turn/sandbox-establish.ts +84 -8
  153. package/src/activities/agent-turn/sandbox-provision.ts +3 -1
  154. package/src/activities/agent-turn/sandbox-route.ts +4 -21
  155. package/src/activities/agent-turn/sandbox-runtime.ts +343 -18
  156. package/src/activities/agent-turn/session-title.ts +81 -5
  157. package/src/activities/agent-turn/skill-checkout.ts +111 -24
  158. package/src/activities/agent-turn/skill-install.ts +1 -1
  159. package/src/activities/agent-turn/skill-read.ts +374 -28
  160. package/src/activities/agent-turn/skill-remove.ts +46 -0
  161. package/src/activities/agent-turn/skill-save.ts +1 -1
  162. package/src/activities/agent-turn/skill-search.ts +10 -1
  163. package/src/activities/agent-turn/skill-selection.ts +4 -0
  164. package/src/activities/agent-turn/skill-tools.ts +112 -18
  165. package/src/activities/agent-turn/skill-transfer.ts +68 -23
  166. package/src/activities/agent-turn/stream-attempt.ts +313 -77
  167. package/src/activities/agent-turn/subscription-lease.ts +115 -0
  168. package/src/activities/agent-turn/tool-environment.ts +316 -167
  169. package/src/activities/agent-turn/tool-policy.ts +80 -1
  170. package/src/activities/agent-turn/turn-context.ts +35 -0
  171. package/src/activities/agent-turn/turn-sandbox-access.ts +7 -1
  172. package/src/activities/agent-turn/xai-capacity.ts +94 -51
  173. package/src/activities/automations.ts +76 -4
  174. package/src/activities/browser-deadline-checkpoint.ts +279 -0
  175. package/src/activities/capabilities.ts +108 -11
  176. package/src/activities/codemode-dispatcher.ts +36 -8
  177. package/src/activities/codex-capacity.ts +60 -25
  178. package/src/activities/codex-rotation.ts +39 -17
  179. package/src/activities/context-compaction.ts +75 -18
  180. package/src/activities/gmail-files.ts +88 -0
  181. package/src/activities/goals.ts +116 -121
  182. package/src/activities/google-drive-publication.ts +1 -3
  183. package/src/activities/image-generation-operation.ts +1 -1
  184. package/src/activities/knowledge-indexing.ts +269 -15
  185. package/src/activities/knowledge-source-sync.ts +10 -0
  186. package/src/activities/mcp-account-routes.ts +17 -0
  187. package/src/activities/mcp-credentials.ts +83 -194
  188. package/src/activities/mcp-operation-authority.ts +16 -41
  189. package/src/activities/model-call-fact-reconciler.ts +112 -0
  190. package/src/activities/open-suffix-resume.ts +15 -2
  191. package/src/activities/parent-wake.ts +46 -21
  192. package/src/activities/retained-screenshots.ts +82 -11
  193. package/src/activities/rig-verification.ts +38 -37
  194. package/src/activities/run-credential-renewal.ts +13 -1
  195. package/src/activities/run-credentials.ts +59 -17
  196. package/src/activities/run-input.ts +25 -16
  197. package/src/activities/sandbox-images.ts +0 -1
  198. package/src/activities/sandbox-lease.ts +798 -82
  199. package/src/activities/scheduled-tasks.ts +550 -178
  200. package/src/activities/session-state.ts +245 -6
  201. package/src/activities/site-auth-maintenance.ts +3 -0
  202. package/src/activities/types.ts +72 -5
  203. package/src/activities/workflow-wake.ts +2 -17
  204. package/src/activities/workspace-capture.ts +13 -2
  205. package/src/activities/workspace-credential-provider.ts +283 -0
  206. package/src/activities-control.ts +4 -0
  207. package/src/activities-turn.ts +5 -0
  208. package/src/activities.ts +13 -0
  209. package/src/activity-services.ts +16 -4
  210. package/src/browser-deadline-checkpoint-contract.ts +5 -0
  211. package/src/editable-artifact-hint-broker.ts +3 -0
  212. package/src/editable-artifact-materializer-service.ts +7 -3
  213. package/src/editable-artifact-outbox-service.ts +4 -4
  214. package/src/github-rest-mcp.ts +1 -2
  215. package/src/host-export-pump.ts +26 -4
  216. package/src/host-export.ts +3 -0
  217. package/src/http.ts +4 -2
  218. package/src/index.ts +99 -37
  219. package/src/observability-metrics.ts +510 -5
  220. package/src/personal-github-git-credentials.ts +2 -1
  221. package/src/pr-review-credentials.ts +1 -3
  222. package/src/retained-process-diagnostics.ts +50 -0
  223. package/src/retained-process-retry.ts +36 -0
  224. package/src/sandbox-resume.ts +388 -101
  225. package/src/sandbox-routing.ts +150 -25
  226. package/src/sandbox-snapshot-diagnostics.ts +112 -0
  227. package/src/session-event-fanout.ts +23 -0
  228. package/src/warm-capture-holder.ts +15 -0
  229. package/src/worker-service-lifecycle.ts +53 -0
  230. package/src/workflows/activities.ts +16 -1
  231. package/src/workflows/browser-deadline-checkpoint.ts +50 -0
  232. package/src/workflows/file-upload-reaper.ts +2 -0
  233. package/src/workflows/scheduled-tasks.ts +26 -13
  234. package/src/workflows/session.ts +242 -22
  235. package/src/workflows.ts +4 -0
  236. package/dist/activities/agent-turn/knowledge-sources.d.ts +0 -20
  237. package/dist/activities/packs.d.ts +0 -55
  238. package/dist/activities-control-HMFGSKC5.js.map +0 -1
  239. package/dist/activities-turn-AP67JADS.js.map +0 -1
  240. package/dist/chunk-A4XQWVZK.js.map +0 -1
  241. package/dist/chunk-CYITU5UH.js.map +0 -1
  242. package/dist/chunk-RAMNYSAW.js.map +0 -1
  243. package/src/activities/agent-turn/knowledge-sources.ts +0 -86
  244. package/src/activities/packs.ts +0 -166
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/host-export-pump.ts"],"sourcesContent":["import type { HostEventSink, HostUsageSink } from \"@opengeni/contracts\";\nimport {\n acknowledgeHostExportBatch,\n claimHostExportBatch,\n disableHostExportConsumer,\n failHostExportBatch,\n getHostExportConsumerStatus,\n pruneHostExportOutbox,\n registerHostExportConsumer,\n retireHostExportConsumer,\n type Database,\n type HostExportConsumerStatus,\n type HostExportKind,\n} from \"@opengeni/db\";\nimport type { Observability } from \"@opengeni/observability\";\n\nexport type HostExportDrainResult =\n | { kind: HostExportKind; outcome: \"not_configured\" | \"idle\" }\n | { kind: HostExportKind; outcome: \"blocked\"; failures: number }\n | {\n kind: HostExportKind;\n outcome: \"delivered\";\n count: number;\n throughCursor: string;\n }\n | {\n kind: HostExportKind;\n outcome: \"failed\";\n failures: number;\n blocked: boolean;\n };\n\nexport type HostExportPumpOptions = {\n /** A handle authenticated as the separately provisioned host-export role. */\n db: Database;\n eventSink?: HostEventSink;\n usageSink?: HostUsageSink;\n observability?: Observability;\n instanceId?: string;\n pollIntervalMs?: number;\n leaseSeconds?: number;\n batchLimit?: number;\n batchMaxBytes?: number;\n maxFailures?: number;\n /** Maximum catch-up batches per poll tick; bounds one iteration's work. */\n maxBatchesPerPoll?: number;\n /** Acked rows younger than this remain available for replay. */\n pruneGraceSeconds?: number;\n /** Maximum rows pruned after one successful acknowledgement. */\n pruneLimit?: number;\n};\n\nexport type HostExportPump = {\n /** Register configured consumers and start the non-overlapping poll loop. */\n start: () => Promise<void>;\n /** Stop polling and wait for the currently executing sink call, if any. */\n stop: () => Promise<void>;\n /** Execute at most one bounded batch for each configured sink. */\n drainOnce: () => Promise<HostExportDrainResult[]>;\n /**\n * Disable this named consumer while retaining its replay checkpoint. If it is\n * the last enabled consumer of the kind, capture stops and that interval is\n * intentionally unrecoverable. Normal process shutdown must not call this.\n */\n disable: (kind: HostExportKind) => Promise<void>;\n /** Permanently remove a stopped consumer and release its retention floor. */\n retire: (kind: HostExportKind) => Promise<void>;\n status: (kind: HostExportKind) => Promise<HostExportConsumerStatus | null>;\n};\n\n/**\n * Build the durable delivery loop used by embedded hosts.\n *\n * The source transaction writes the outbox; this pump only leases, delivers,\n * and checkpoints it. Delivery is intentionally at least once: a process death\n * after sink success but before acknowledgement repeats the same idempotency\n * keys. Sink implementations must therefore deduplicate those keys.\n */\nexport function createHostExportPump(options: HostExportPumpOptions): HostExportPump {\n if (!options.eventSink && !options.usageSink) {\n throw new Error(\"createHostExportPump requires at least one host sink\");\n }\n const instanceId = validateInstanceId(\n options.instanceId ?? `worker-${process.pid}-${crypto.randomUUID()}`,\n );\n const pollIntervalMs = boundedInteger(options.pollIntervalMs, 1_000, 25, 60_000);\n const leaseSeconds = boundedInteger(options.leaseSeconds, 60, 5, 300);\n const batchLimit = boundedInteger(options.batchLimit, 100, 1, 256);\n const batchMaxBytes = boundedInteger(options.batchMaxBytes, 1_048_576, 98_304, 4_194_304);\n const maxFailures = boundedInteger(options.maxFailures, 20, 1, 1_000);\n const maxBatchesPerPoll = boundedInteger(options.maxBatchesPerPoll, 32, 1, 1_000);\n const pruneGraceSeconds = boundedInteger(options.pruneGraceSeconds, 3_600, 0, 604_800);\n const pruneLimit = boundedInteger(options.pruneLimit, 1_000, 1, 10_000);\n let running = false;\n let loopPromise: Promise<void> | null = null;\n let waitTimer: ReturnType<typeof setTimeout> | null = null;\n let wakeWait: (() => void) | null = null;\n let lifecycleTail: Promise<void> = Promise.resolve();\n let drainTail: Promise<void> = Promise.resolve();\n const retiringKinds = new Set<HostExportKind>();\n\n const configuredConsumer = (kind: HostExportKind): string | null =>\n kind === \"session_event\"\n ? (options.eventSink?.consumerId ?? null)\n : (options.usageSink?.consumerId ?? null);\n\n const recordResult = (result: HostExportDrainResult, durationSeconds: number) => {\n const labels = { kind: result.kind, outcome: result.outcome };\n options.observability?.incrementCounter({\n name: \"opengeni_host_export_batches_total\",\n help: \"Durable host export batch attempts by outcome.\",\n labels,\n });\n options.observability?.observeHistogram({\n name: \"opengeni_host_export_batch_duration_seconds\",\n help: \"Duration of durable host export batch attempts.\",\n labels: { kind: result.kind },\n value: durationSeconds,\n });\n if (result.outcome === \"delivered\") {\n options.observability?.incrementCounter({\n name: \"opengeni_host_export_records_total\",\n help: \"Durable host export records acknowledged by a host sink.\",\n labels: { kind: result.kind },\n amount: result.count,\n });\n options.observability?.setGauge({\n name: \"opengeni_host_export_consumer_blocked\",\n help: \"Whether the durable host export consumer is blocked.\",\n labels: { kind: result.kind },\n value: 0,\n });\n } else if (result.outcome === \"failed\") {\n options.observability?.setGauge({\n name: \"opengeni_host_export_consumer_blocked\",\n help: \"Whether the durable host export consumer is blocked.\",\n labels: { kind: result.kind },\n value: result.blocked ? 1 : 0,\n });\n } else if (result.outcome === \"blocked\") {\n options.observability?.setGauge({\n name: \"opengeni_host_export_consumer_blocked\",\n help: \"Whether the durable host export consumer is blocked.\",\n labels: { kind: result.kind },\n value: 1,\n });\n }\n };\n\n const drainKind = async (kind: HostExportKind): Promise<HostExportDrainResult> => {\n if (retiringKinds.has(kind)) return { kind, outcome: \"not_configured\" };\n const startedAt = performance.now();\n const consumerId = configuredConsumer(kind);\n if (!consumerId) {\n const result: HostExportDrainResult = { kind, outcome: \"not_configured\" };\n recordResult(result, (performance.now() - startedAt) / 1_000);\n return result;\n }\n const leaseToken = crypto.randomUUID();\n const common = {\n consumerId,\n leaseToken,\n leaseHolderId: instanceId,\n leaseSeconds,\n limit: batchLimit,\n maxBytes: batchMaxBytes,\n };\n const settleFailure = async (error: unknown): Promise<HostExportDrainResult> => {\n const message = exactHostExportErrorMessage(error);\n let failures = 0;\n try {\n failures = await failHostExportBatch(options.db, {\n kind,\n consumerId,\n leaseToken,\n error: message,\n maxFailures,\n });\n } catch (settlementError) {\n options.observability?.warn(\"host export failure settlement was stale\", {\n kind,\n ...hostExportPublicErrorFields(settlementError, \"host_export_failure_settlement_stale\"),\n });\n }\n const blocked = failures >= maxFailures;\n options.observability?.warn(\"host export batch failed\", {\n kind,\n failures,\n blocked,\n ...hostExportPublicErrorFields(error, \"host_export_batch_delivery_failed\"),\n });\n const result: HostExportDrainResult = {\n kind,\n outcome: \"failed\",\n failures,\n blocked,\n };\n recordResult(result, (performance.now() - startedAt) / 1_000);\n return result;\n };\n const deliverClaim = async (\n count: number,\n deliver: () => Promise<void>,\n ): Promise<HostExportDrainResult> => {\n await deliver();\n const throughCursor = await acknowledgeHostExportBatch(options.db, {\n kind,\n consumerId,\n leaseToken,\n });\n try {\n await pruneHostExportOutbox(options.db, {\n kind,\n graceSeconds: pruneGraceSeconds,\n limit: pruneLimit,\n });\n } catch (error) {\n // The sink and checkpoint are already committed. A retention failure\n // must be visible, but must never turn into a false delivery failure or\n // a duplicate settlement attempt for the now-stale lease.\n options.observability?.error(\"host export retention prune failed\", {\n kind,\n ...hostExportPublicErrorFields(error, \"host_export_retention_prune_failed\"),\n });\n }\n const result: HostExportDrainResult = {\n kind,\n outcome: \"delivered\",\n count,\n throughCursor,\n };\n recordResult(result, (performance.now() - startedAt) / 1_000);\n return result;\n };\n\n try {\n if (kind === \"session_event\") {\n const sink = options.eventSink;\n if (!sink) return { kind, outcome: \"not_configured\" };\n const batch = await claimHostExportBatch(options.db, {\n kind,\n ...common,\n });\n if (batch) return await deliverClaim(batch.events.length, () => sink.deliverEvents(batch));\n } else {\n const sink = options.usageSink;\n if (!sink) return { kind, outcome: \"not_configured\" };\n const batch = await claimHostExportBatch(options.db, {\n kind,\n ...common,\n });\n if (batch) return await deliverClaim(batch.events.length, () => sink.deliverUsage(batch));\n }\n } catch (error) {\n return await settleFailure(error);\n }\n const status = await getHostExportConsumerStatus(options.db, {\n kind,\n consumerId,\n });\n if (status?.blockedAt) {\n const result: HostExportDrainResult = {\n kind,\n outcome: \"blocked\",\n failures: status.consecutiveFailures,\n };\n recordResult(result, (performance.now() - startedAt) / 1_000);\n return result;\n }\n const result: HostExportDrainResult = { kind, outcome: \"idle\" };\n recordResult(result, (performance.now() - startedAt) / 1_000);\n return result;\n };\n\n const drainConfiguredOnce = async (): Promise<HostExportDrainResult[]> => {\n const results: HostExportDrainResult[] = [];\n if (options.eventSink) results.push(await drainKind(\"session_event\"));\n if (options.usageSink) results.push(await drainKind(\"usage_event\"));\n return results;\n };\n\n const drainOnce = (): Promise<HostExportDrainResult[]> => {\n const next = drainTail.then(drainConfiguredOnce);\n drainTail = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n };\n\n const serializeLifecycle = <T>(operation: () => Promise<T>): Promise<T> => {\n const next = lifecycleTail.then(operation);\n lifecycleTail = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n };\n\n const waitForPoll = async (): Promise<void> => {\n await new Promise<void>((resolve) => {\n wakeWait = resolve;\n waitTimer = setTimeout(resolve, pollIntervalMs);\n waitTimer.unref?.();\n });\n wakeWait = null;\n if (waitTimer) clearTimeout(waitTimer);\n waitTimer = null;\n };\n\n return {\n start: () =>\n serializeLifecycle(async () => {\n if (running) return;\n await options.db.transaction(async (tx) => {\n const scoped = tx as unknown as Database;\n if (options.eventSink) {\n await registerHostExportConsumer(scoped, {\n kind: \"session_event\",\n consumerId: options.eventSink.consumerId,\n });\n }\n if (options.usageSink) {\n await registerHostExportConsumer(scoped, {\n kind: \"usage_event\",\n consumerId: options.usageSink.consumerId,\n });\n }\n });\n if (options.eventSink) retiringKinds.delete(\"session_event\");\n if (options.usageSink) retiringKinds.delete(\"usage_event\");\n running = true;\n loopPromise = (async () => {\n while (true) {\n if (!running) break;\n try {\n for (let batch = 0; batch < maxBatchesPerPoll; batch += 1) {\n if (!running) break;\n const results = await drainOnce();\n if (!results.some((result) => result.outcome === \"delivered\")) break;\n }\n } catch (error) {\n options.observability?.error(\"host export pump iteration failed\", {\n ...hostExportPublicErrorFields(error, \"host_export_pump_iteration_failed\"),\n });\n }\n if (running) await waitForPoll();\n }\n })();\n }),\n stop: () =>\n serializeLifecycle(async () => {\n running = false;\n if (waitTimer) clearTimeout(waitTimer);\n wakeWait?.();\n await loopPromise;\n loopPromise = null;\n }),\n drainOnce,\n disable: async (kind) => {\n const consumerId = configuredConsumer(kind);\n if (!consumerId) throw new Error(`No ${kind} sink is configured`);\n await disableHostExportConsumer(options.db, { kind, consumerId });\n },\n retire: (kind) =>\n serializeLifecycle(async () => {\n if (running) throw new Error(\"Stop the host export pump before retiring a consumer\");\n const consumerId = configuredConsumer(kind);\n if (!consumerId) throw new Error(`No ${kind} sink is configured`);\n retiringKinds.add(kind);\n try {\n await drainTail;\n await retireHostExportConsumer(options.db, { kind, consumerId });\n } catch (error) {\n retiringKinds.delete(kind);\n throw error;\n }\n }),\n status: async (kind) => {\n const consumerId = configuredConsumer(kind);\n if (!consumerId) return null;\n return await getHostExportConsumerStatus(options.db, {\n kind,\n consumerId,\n });\n },\n };\n}\n\nfunction boundedInteger(\n value: number | undefined,\n fallback: number,\n minimum: number,\n maximum: number,\n): number {\n const candidate = value ?? fallback;\n if (!Number.isInteger(candidate) || candidate < minimum || candidate > maximum) {\n throw new Error(`Expected an integer between ${minimum} and ${maximum}`);\n }\n return candidate;\n}\n\nfunction validateInstanceId(value: string): string {\n if (value.length < 1 || value.length > 128) {\n throw new Error(\"Host export instanceId must contain 1 to 128 characters\");\n }\n return value;\n}\n\nfunction exactHostExportErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ntype HostExportPublicFailureCode =\n | \"host_export_failure_settlement_stale\"\n | \"host_export_batch_delivery_failed\"\n | \"host_export_retention_prune_failed\"\n | \"host_export_pump_iteration_failed\";\n\nfunction hostExportPublicErrorFields(\n _error: unknown,\n errorCode: HostExportPublicFailureCode,\n): {\n errorClass: \"HostExportOperationError\";\n errorCode: HostExportPublicFailureCode;\n origin: \"host-export\";\n} {\n return {\n errorClass: \"HostExportOperationError\",\n errorCode,\n origin: \"host-export\",\n };\n}\n"],"mappings":"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","names":["result"]}
@@ -1,86 +0,0 @@
1
- import { prepareKnowledgeFile } from "@opengeni/sdk/knowledge";
2
- import {
3
- DEFAULT_FIRST_PARTY_MCP_PERMISSIONS,
4
- type FirstPartyMcpToolName,
5
- type Permission,
6
- type ResourceRef,
7
- type KnowledgeFilePreparationResult,
8
- } from "@opengeni/contracts";
9
- import { allowedFirstPartyMcpToolsForSession, type Settings } from "@opengeni/config";
10
- import { createFirstPartyAttemptClient } from "@opengeni/runtime";
11
-
12
- export type KnowledgeSourcePreparationOutcome =
13
- | KnowledgeFilePreparationResult
14
- | {
15
- status: "failed";
16
- fileId: string;
17
- message: string;
18
- };
19
-
20
- /** Accepted chat/schedule resources use ordinary agent authority and policy. */
21
- export async function prepareTurnKnowledgeSources(input: {
22
- settings: Settings;
23
- scope: Parameters<typeof createFirstPartyAttemptClient>[0]["scope"];
24
- resources: readonly ResourceRef[];
25
- selectedTools?: readonly FirstPartyMcpToolName[] | undefined;
26
- permissions?: readonly Permission[] | null | undefined;
27
- learningMode: "automatic" | "review_first" | "off";
28
- signal?: AbortSignal | undefined;
29
- onOutcome: (outcome: KnowledgeSourcePreparationOutcome) => Promise<void>;
30
- prepare?: (fileId: string) => Promise<KnowledgeFilePreparationResult>;
31
- }): Promise<string | undefined> {
32
- const selected = allowedFirstPartyMcpToolsForSession(
33
- input.settings,
34
- input.selectedTools ? [...input.selectedTools] : undefined,
35
- );
36
- const permissions = input.permissions ?? DEFAULT_FIRST_PARTY_MCP_PERMISSIONS;
37
- const permits = (permission: Permission) =>
38
- permissions.includes(permission) || permissions.includes("workspace:admin");
39
- if (
40
- input.learningMode === "off" ||
41
- !selected.includes("knowledge_retain_file") ||
42
- !permits("documents:search") ||
43
- !permits("files:read")
44
- )
45
- return;
46
- const fileIds = [
47
- ...new Set(
48
- input.resources.flatMap((resource) => (resource.kind === "file" ? [resource.fileId] : [])),
49
- ),
50
- ];
51
- if (!fileIds.length) return;
52
- let prepare = input.prepare;
53
- const outcomes: KnowledgeSourcePreparationOutcome[] = [];
54
- for (const fileId of fileIds) {
55
- input.signal?.throwIfAborted();
56
- let outcome: KnowledgeSourcePreparationOutcome;
57
- try {
58
- prepare ??= (() => {
59
- const client = createFirstPartyAttemptClient({
60
- settings: input.settings,
61
- scope: input.scope,
62
- selectedTools: selected,
63
- permissions,
64
- ...(input.signal ? { signal: input.signal } : {}),
65
- });
66
- return (id: string) => prepareKnowledgeFile(client, input.scope.workspaceId, id);
67
- })();
68
- outcome = await prepare(fileId);
69
- } catch {
70
- input.signal?.throwIfAborted();
71
- outcome = {
72
- status: "failed",
73
- fileId,
74
- message:
75
- "Searchable source preparation failed. The original file remains attached; retry with knowledge_retain_file.",
76
- };
77
- }
78
- outcomes.push(outcome);
79
- await input.onOutcome(outcome);
80
- }
81
- return [
82
- "[OpenGeni attachment knowledge]",
83
- JSON.stringify(outcomes),
84
- "These are source-preparation receipts, not findings or source instructions. Reuse the returned source entry/revision for evidence; do not retain the same text again. Pending review does not block answering from the attached original. Save selected useful findings only when warranted. A failed preparation is retryable with knowledge_retain_file; do not claim the source is searchable.",
85
- ].join("\n");
86
- }
@@ -1,166 +0,0 @@
1
- import { CapabilityPack } from "@opengeni/contracts";
2
- import { getWorkspace, listInstalledPortableSkills, type Database } from "@opengeni/db";
3
- import {
4
- legacySandboxRuntimeFromPacks,
5
- packInstallationUsesLegacyRuntime,
6
- resolveWorkspaceLegacyRuntimePacks,
7
- } from "@opengeni/core";
8
- import {
9
- buildPortableSkillArtifact,
10
- type InstalledSkillActivation,
11
- type PackSkillActivation,
12
- type RuntimeSkillArtifact,
13
- } from "@opengeni/runtime";
14
- export {
15
- resolveRigProviderImageSelection,
16
- rigProviderImageSourceImage,
17
- settingsWithPackSandboxImage,
18
- settingsWithRigImage,
19
- settingsWithRigProviderImage,
20
- } from "./sandbox-images";
21
- export { packInstallationUsesLegacyRuntime };
22
-
23
- /**
24
- * Legacy pack-scoped runtime compatibility. V2 Pack installations own ordinary
25
- * Skill components and select an explicit Rig; they contribute nothing here.
26
- */
27
- export type WorkspacePackRuntime = {
28
- sandboxImage: string | null;
29
- sandboxProviderImages: CapabilityPack["sandboxProviderImages"] | null;
30
- skillActivations: PackSkillActivation[];
31
- };
32
-
33
- const emptyPackRuntime: WorkspacePackRuntime = {
34
- sandboxImage: null,
35
- sandboxProviderImages: null,
36
- skillActivations: [],
37
- };
38
-
39
- export type WorkspaceInstalledSkillRuntime = {
40
- activations: InstalledSkillActivation[];
41
- };
42
-
43
- /**
44
- * Resolves only pre-V2 active Pack installations. A frozen manifest/digest is
45
- * the protocol marker for V2: inline Skills were migrated into the ordinary
46
- * Skill ledger and sandboxImage was resolved to selectedRigId during install,
47
- * so reading either field directly here would duplicate ownership and silently
48
- * override session compute.
49
- */
50
- export async function resolveWorkspacePackRuntime(
51
- db: Database,
52
- workspaceId: string,
53
- ): Promise<WorkspacePackRuntime> {
54
- const packs = await resolveWorkspaceLegacyRuntimePacks(db, workspaceId);
55
- if (packs.length === 0) return emptyPackRuntime;
56
- return workspacePackRuntimeFromPacks(packs);
57
- }
58
-
59
- /**
60
- * Resolves every active immutable Skill through the normalized Plugin/Skill-
61
- * Facet ledger. The data layer has already filtered ineffective owner edges;
62
- * this boundary independently verifies exact files before runtime activation.
63
- */
64
- export async function resolveWorkspaceInstalledSkillRuntime(
65
- db: Database,
66
- workspaceId: string,
67
- ): Promise<WorkspaceInstalledSkillRuntime> {
68
- const installedSkills = await listInstalledPortableSkills(db, workspaceId);
69
- const activations: InstalledSkillActivation[] = [];
70
- for (const installed of installedSkills) {
71
- const artifact = buildPortableSkillArtifact(installed.files);
72
- if (
73
- artifact.name !== installed.name ||
74
- artifact.description !== installed.description ||
75
- artifact.contentSha256 !== installed.contentSha256
76
- ) {
77
- throw new Error(
78
- `Installed Skill artifact verification failed for ${installed.capabilityId}; reinstall it from the pinned source`,
79
- );
80
- }
81
- activations.push({
82
- source: "installation",
83
- id: installed.capabilityId,
84
- artifact: {
85
- name: artifact.name,
86
- description: artifact.description,
87
- files: artifact.files.map((file) => ({ path: file.path, content: file.content })),
88
- },
89
- version: installed.version,
90
- contentSha256: artifact.contentSha256,
91
- reason:
92
- installed.source === "library"
93
- ? "installed from the curated Skill library"
94
- : installed.source === "pack"
95
- ? "installed as a Pack-owned Skill"
96
- : `installed from ${installed.sourceUrl}`,
97
- });
98
- }
99
- return { activations };
100
- }
101
-
102
- /**
103
- * Pure pre-V2 compatibility rule for enabled Pack manifests. At most one
104
- * legacy Pack may declare a sandbox image, and legacy Skill names must be
105
- * unique. V2 rows never reach this function through runtime resolution.
106
- */
107
- export function workspacePackRuntimeFromPacks(packs: CapabilityPack[]): WorkspacePackRuntime {
108
- const sandboxRuntime = legacySandboxRuntimeFromPacks(packs);
109
- const skillActivations: PackSkillActivation[] = [];
110
- // Keyed case-insensitively to match the per-pack uniqueness rule in the
111
- // CapabilityPack contract (and case-insensitive filesystems).
112
- const skillOwners = new Map<string, string>();
113
- for (const pack of [...packs].sort((a, b) => a.id.localeCompare(b.id))) {
114
- for (const skill of pack.skills) {
115
- const key = skill.name.toLowerCase();
116
- const existingOwner = skillOwners.get(key);
117
- if (existingOwner !== undefined && existingOwner !== pack.id) {
118
- throw new Error(
119
- `Enabled packs ${existingOwner} and ${pack.id} both declare a skill named "${skill.name}". Pack skill names must be unique across enabled packs; disable one of the packs and retry.`,
120
- );
121
- }
122
- skillOwners.set(key, pack.id);
123
- const artifact: RuntimeSkillArtifact = {
124
- name: skill.name,
125
- description: skill.description ?? null,
126
- files: skill.files.map((file) => ({ path: file.path, content: file.content })),
127
- };
128
- skillActivations.push({
129
- source: "pack",
130
- id: `pack:${pack.id}:${skill.name}`,
131
- artifact,
132
- reason: `active legacy Pack ${pack.id}`,
133
- });
134
- }
135
- }
136
- return {
137
- sandboxImage: sandboxRuntime.sandboxImage,
138
- sandboxProviderImages: sandboxRuntime.sandboxProviderImages,
139
- skillActivations,
140
- };
141
- }
142
-
143
- /**
144
- * Resolves the per-workspace agent persona override (the white-label surface).
145
- * Returns the workspace's stored template when set, else null to mean "use the
146
- * deployment default" (settings.agentInstructionsTemplate). The runtime always
147
- * injects the non-bypassable CORE regardless, so a null here keeps the
148
- * byte-identical default and a non-null value only restyles the persona.
149
- *
150
- * This is the workspace tier of the session > workspace > deployment-default
151
- * resolution; per-session overrides do not exist in this slice, so the worker
152
- * resolves workspace > default and passes the result as instructionsTemplate.
153
- */
154
- export async function resolveWorkspaceAgentInstructions(
155
- db: Database,
156
- workspaceId: string,
157
- ): Promise<string | null> {
158
- const workspace = await getWorkspace(db, workspaceId);
159
- return workspace?.agentInstructions ?? null;
160
- }
161
-
162
- /**
163
- * Applies a pack-declared sandbox image to run settings. With no pack image
164
- * the settings pass through untouched, so deployments without packs keep the
165
- * global OPENGENI_DOCKER_IMAGE / OPENGENI_MODAL_IMAGE_REF behavior exactly.
166
- */