@opengeni/worker-bundle 2.2.0-canary.36855269964001 → 2.2.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 (44) hide show
  1. package/dist/activities/agent-run-admission.d.ts +1 -3
  2. package/dist/activities/agent-turn/admission.d.ts +3 -24
  3. package/dist/activities/agent-turn/claude-usage-observer.d.ts +1 -13
  4. package/dist/activities/agent-turn/run-credentials.d.ts +0 -2
  5. package/dist/activities/agent-turn/stream-attempt.d.ts +0 -1
  6. package/dist/activities/agent-turn/turn-context.d.ts +0 -1
  7. package/dist/activities/goals.d.ts +0 -8
  8. package/dist/activities/run-credentials.d.ts +2 -4
  9. package/dist/activities/types.d.ts +1 -1
  10. package/dist/{activities-control-YKXRDVMB.js → activities-control-MHNA3CYV.js} +66 -28
  11. package/dist/activities-control-MHNA3CYV.js.map +1 -0
  12. package/dist/{activities-turn-V37B7CQY.js → activities-turn-FQ5OO2WW.js} +197 -540
  13. package/dist/activities-turn-FQ5OO2WW.js.map +1 -0
  14. package/dist/{chunk-ZCCLJK3V.js → chunk-RZAAGRFQ.js} +65 -145
  15. package/dist/chunk-RZAAGRFQ.js.map +1 -0
  16. package/dist/index.js +1 -1
  17. package/dist/workflow-bundle.js +1 -1
  18. package/package.json +20 -20
  19. package/src/activities/agent-run-admission.ts +1 -17
  20. package/src/activities/agent-turn/admission.ts +1 -64
  21. package/src/activities/agent-turn/claim.ts +14 -56
  22. package/src/activities/agent-turn/claude-usage-observer.ts +1 -33
  23. package/src/activities/agent-turn/errors.ts +0 -46
  24. package/src/activities/agent-turn/failure-settlement.ts +0 -5
  25. package/src/activities/agent-turn/run-credentials.ts +3 -15
  26. package/src/activities/agent-turn/run.ts +3 -32
  27. package/src/activities/agent-turn/stream-attempt.ts +35 -138
  28. package/src/activities/agent-turn/tool-environment.ts +20 -13
  29. package/src/activities/agent-turn/turn-context.ts +0 -1
  30. package/src/activities/capabilities.ts +14 -52
  31. package/src/activities/goals.ts +78 -38
  32. package/src/activities/knowledge-indexing.ts +0 -29
  33. package/src/activities/run-credentials.ts +16 -22
  34. package/src/activities/scheduled-tasks.ts +0 -1
  35. package/src/activities/types.ts +0 -1
  36. package/src/activities/workspace-credential-provider.ts +0 -12
  37. package/src/sandbox-routing.ts +2 -4
  38. package/dist/activities/agent-turn/final-reply.d.ts +0 -18
  39. package/dist/activities/agent-turn/model-call-admission.d.ts +0 -15
  40. package/dist/activities-control-YKXRDVMB.js.map +0 -1
  41. package/dist/activities-turn-V37B7CQY.js.map +0 -1
  42. package/dist/chunk-ZCCLJK3V.js.map +0 -1
  43. package/src/activities/agent-turn/final-reply.ts +0 -46
  44. package/src/activities/agent-turn/model-call-admission.ts +0 -94
@@ -1,6 +1,6 @@
1
1
  import { type Settings } from "@opengeni/config";
2
2
  import type { ControlActivityServices } from "./types.js";
3
- export type AgentRunAdmissionDenial = "insufficient_credits" | "allowance_exhausted" | "monthly_model_cost_limit" | "monthly_agent_run_limit";
3
+ export type AgentRunAdmissionDenial = "insufficient_credits" | "monthly_model_cost_limit" | "monthly_agent_run_limit";
4
4
  /** One worker-side admission boundary for service-authored agent runs. */
5
5
  export declare function agentRunAdmissionDenial(services: Pick<ControlActivityServices, "db" | "entitlements"> & {
6
6
  settings: Settings;
@@ -9,6 +9,4 @@ export declare function agentRunAdmissionDenial(services: Pick<ControlActivitySe
9
9
  workspaceId: string;
10
10
  model: string;
11
11
  requestedAgentRuns: number;
12
- /** The accepted work's causal human, not the scheduler/service caller. */
13
- initiatingHumanSubjectId?: string | null;
14
12
  }): Promise<AgentRunAdmissionDenial | null>;
@@ -1,6 +1,6 @@
1
1
  import { resolveTurnExecutionPolicyV1, type Settings } from "@opengeni/config";
2
2
  import type { TurnActivityServices as ActivityServices } from "../types.js";
3
- import { type AllowanceExhaustedRefusal, type SessionEvent, type SessionTurn, type ToolAuthNeededPayload, type TurnExecutionPolicyV1, type XaiProviderAccountAuthoritySnapshotV1 } from "@opengeni/contracts";
3
+ import { type SessionEvent, type SessionTurn, type ToolAuthNeededPayload, type TurnExecutionPolicyV1, type XaiProviderAccountAuthoritySnapshotV1 } from "@opengeni/contracts";
4
4
  export declare class WorkspaceHumanInputDisabledError extends Error {
5
5
  constructor(kind: "resume" | "interruption");
6
6
  }
@@ -62,27 +62,6 @@ export declare function stableInteractionInterventionUuid(namespace: string, ses
62
62
  */
63
63
  export declare class BudgetExhaustedError extends Error {
64
64
  readonly serializedRunState: string | null;
65
- readonly allowance: AllowanceRefusal | null;
66
- constructor(message: string, serializedRunState: string | null, allowance?: AllowanceRefusal | null);
65
+ constructor(message: string, serializedRunState: string | null);
67
66
  }
68
- export type AllowanceRefusal = AllowanceExhaustedRefusal;
69
- /** Account allowance exhaustion is recoverable state, never a provider failure. */
70
- export declare class AllowanceExhaustedError extends Error {
71
- readonly refusal: AllowanceRefusal;
72
- readonly code = "allowance_exhausted";
73
- constructor(refusal: AllowanceRefusal);
74
- }
75
- /** Revalidate between paid calls without replaying provider work or reserving credits. */
76
- export declare function ensureRunAllowedBetweenModelCalls(input: {
77
- settings: Settings;
78
- db: ActivityServices["db"];
79
- accountId: string;
80
- workspaceId: string;
81
- isExternallyBilledTurn: boolean;
82
- entitlements?: ActivityServices["entitlements"];
83
- chargesOpenGeniCredits: boolean;
84
- countsTowardTokenCap: boolean;
85
- initiatingHumanSubjectId: string | null;
86
- serializedRunState?: () => string | null;
87
- }): Promise<void>;
88
- export declare function ensureRunAllowed(settings: Settings, db: ActivityServices["db"], accountId: string, workspaceId: string, isExternallyBilledTurn: boolean, entitlements?: ActivityServices["entitlements"], chargesOpenGeniCredits?: boolean, countsTowardTokenCap?: boolean, initiatingHumanSubjectId?: string | null): Promise<void>;
67
+ export declare function ensureRunAllowed(settings: Settings, db: ActivityServices["db"], accountId: string, workspaceId: string, isExternallyBilledTurn: boolean, entitlements?: ActivityServices["entitlements"], chargesOpenGeniCredits?: boolean, countsTowardTokenCap?: boolean): Promise<void>;
@@ -15,17 +15,5 @@ export declare function createClaudeUsageObserver(providers: ReturnType<typeof p
15
15
  token: string;
16
16
  connectionId: string;
17
17
  credentialVersion: number;
18
- } | null>): Promise<((providerId: string, response: Response) => void) & {
19
- binding(providerId: string): {
20
- readonly scope: Scope;
21
- readonly token: string;
22
- readonly expectedConnectionId: string;
23
- readonly expectedCredentialVersion: number;
24
- } | undefined;
25
- renew(providerId: string, credential: {
26
- token: string;
27
- connectionId: string;
28
- credentialVersion: number;
29
- }): void;
30
- }>;
18
+ } | null>): Promise<(providerId: string, response: Response) => void>;
31
19
  export {};
@@ -2,7 +2,6 @@ import { type GitCredentialTokenWriterSession, type NormalizedRunCredentialMater
2
2
  import { type Settings } from "@opengeni/config";
3
3
  import { type GitHubTokenMintAuthorization, type MintedRunGitCredentials, type loadWorkspaceEnvironmentForRunWithCredentials } from "../environment.js";
4
4
  import type { mergeResourceRefs } from "../common.js";
5
- import type { withFirstPartyTools } from "../goals.js";
6
5
  import type { TurnActivityServices as ActivityServices, RunAgentTurnInput } from "../types.js";
7
6
  import { type ResumedTurnSandbox } from "../../sandbox-resume.js";
8
7
  import type { ClaimTurnOk } from "./claim.js";
@@ -11,7 +10,6 @@ import type { SandboxTurnRuntime } from "./sandbox-runtime.js";
11
10
  import type { AttemptIdentityState, EventingState, RenewalState, SandboxRuntimeState } from "./turn-context.js";
12
11
  export type PrepareRunCredentialsDeps = {
13
12
  localMcpServerIds?: readonly string[];
14
- turnTools: ReturnType<typeof withFirstPartyTools>;
15
13
  input: RunAgentTurnInput;
16
14
  settings: Settings;
17
15
  db: ActivityServices["db"];
@@ -81,7 +81,6 @@ export type TurnStreamAttemptDeps = {
81
81
  groupBoxBackend: Settings["sandboxBackend"];
82
82
  turnExecutionPolicy: TurnExecutionPolicyV1;
83
83
  turn: Pick<SessionTurn, "initiator" | "initiatorContext"> & {
84
- initiatingHumanSubjectId: string | null;
85
84
  id: string;
86
85
  executionGeneration: number;
87
86
  model: string;
@@ -25,7 +25,6 @@ export type TurnSettleFn = (input: {
25
25
  sessionStatus: SessionStatus;
26
26
  activeTurnId: string | null;
27
27
  suppressGoalContinuation?: boolean;
28
- allowanceGoalPause?: ApplySessionTurnSettlementInput["allowanceGoalPause"];
29
28
  consumeRequestedCompactionFailure?: boolean;
30
29
  runState?: ApplySessionTurnSettlementInput["runState"];
31
30
  }) => Promise<boolean>;
@@ -2,7 +2,6 @@ import { type Settings } from "@opengeni/config";
2
2
  import { type SessionGoal, type ToolRef } from "@opengeni/contracts";
3
3
  import { getWorkspaceModelPolicy } from "@opengeni/db";
4
4
  import type { ControlActivityServices, MaybeContinueGoalInput, MaybeContinueGoalResult } from "./types.js";
5
- import { agentRunAdmissionDenial } from "./agent-run-admission.js";
6
5
  export declare function createGoalActivities(services: () => Promise<ControlActivityServices>): {
7
6
  enqueueGoalRetryWake: (input: MaybeContinueGoalInput) => Promise<void>;
8
7
  maybeContinueGoal: (input: MaybeContinueGoalInput) => Promise<MaybeContinueGoalResult>;
@@ -28,10 +27,3 @@ export declare function goalContinuationPrompt(_goal: SessionGoal, _autoContinua
28
27
  * lists anywhere else in the pipeline. No-op when the server is not configured.
29
28
  */
30
29
  export declare function withFirstPartyTools(settings: Settings, tools: ToolRef[]): ToolRef[];
31
- /**
32
- * Goals share scheduled admission and pause visibly without synthesizing work.
33
- */
34
- export declare function goalRunBudgetBlocked(services: Parameters<typeof agentRunAdmissionDenial>[0], input: Omit<Parameters<typeof agentRunAdmissionDenial>[1], "requestedAgentRuns">): Promise<{
35
- pausedReason: "limits" | "allowance";
36
- message: string;
37
- } | null>;
@@ -1,4 +1,4 @@
1
- import type { ConnectionCredentialsPort, CredentialAuthNeededPayload, SandboxBackend, RunCredentialsRequest, Session, SessionTurn, ToolRef } from "@opengeni/contracts";
1
+ import type { ConnectionCredentialsPort, CredentialAuthNeededPayload, SandboxBackend, RunCredentialsRequest, Session, SessionTurn } from "@opengeni/contracts";
2
2
  import type { Settings } from "@opengeni/config";
3
3
  import { type Database } from "@opengeni/db";
4
4
  import { type NormalizedRunCredentialMaterial } from "@opengeni/runtime";
@@ -22,8 +22,6 @@ export type RunCredentialResolutionContext = {
22
22
  initiatingHumanSubjectId?: string | null;
23
23
  /** Installed in-process API routes must never enter a product callback. */
24
24
  localMcpServerIds?: readonly string[];
25
- /** Exact execution selection, resolved once at the turn policy boundary. */
26
- effectiveTools: readonly ToolRef[];
27
25
  };
28
26
  export type BoundRunCredentialResolver = {
29
27
  resolve(input: {
@@ -31,7 +29,7 @@ export type BoundRunCredentialResolver = {
31
29
  forceRefresh: boolean;
32
30
  }): Promise<NormalizedRunCredentialMaterial | null>;
33
31
  };
34
- export declare function buildRunCredentialsRequest(input: Omit<RunCredentialResolutionContext, "db" | "connectionCredentials" | "settings" | "initiatingHumanSubjectId" | "effectiveTools"> & {
32
+ export declare function buildRunCredentialsRequest(input: Omit<RunCredentialResolutionContext, "db" | "connectionCredentials" | "settings" | "initiatingHumanSubjectId"> & {
35
33
  rootSessionId: string;
36
34
  purpose: "provision" | "renewal";
37
35
  forceRefresh: boolean;
@@ -357,7 +357,7 @@ export type DispatchScheduledTaskRunResult = {
357
357
  diagnostic?: import("@opengeni/contracts").ConnectionAccountSelectionDiagnostic;
358
358
  /** Present when the occurrence was refused as a visible run receipt. */
359
359
  refusal?: import("@opengeni/contracts").ScheduledTaskAdmissionRefusal;
360
- reason: "insufficient_credits" | "allowance_exhausted" | "monthly_model_cost_limit" | "monthly_agent_run_limit" | "malformed_manual_trigger" | "scheduled_task_paused" | "scheduled_authority_exhausted" | "scheduled_run_terminal" | "scheduled_execution_unrepresentable" | "connection_account_unavailable" | "scheduled_authority_unavailable" | "machine_target_unavailable" | "machine_enrollment_inactive" | "variable_set_unavailable" | "rig_version_unavailable" | "knowledge_source_paused" | "legacy_source_schedule_requires_migration" | "incident_preflight_metadata_missing" | "incident_responder_under_capable" | "incident_data_source_unsuitable";
360
+ reason: "insufficient_credits" | "monthly_model_cost_limit" | "monthly_agent_run_limit" | "malformed_manual_trigger" | "scheduled_task_paused" | "scheduled_authority_exhausted" | "scheduled_run_terminal" | "scheduled_execution_unrepresentable" | "connection_account_unavailable" | "scheduled_authority_unavailable" | "machine_target_unavailable" | "machine_enrollment_inactive" | "variable_set_unavailable" | "rig_version_unavailable" | "knowledge_source_paused" | "legacy_source_schedule_requires_migration" | "incident_preflight_metadata_missing" | "incident_responder_under_capable" | "incident_data_source_unsuitable";
361
361
  } | {
362
362
  action: "start" | "signal";
363
363
  accountId: string;
@@ -8,7 +8,6 @@ import {
8
8
  import {
9
9
  INCIDENT_TELEMETRY_AUTHORITY_FENCE_LINEAGE_KEY,
10
10
  MAX_AUTOMATIC_PROVIDER_RECOVERIES,
11
- agentRunAdmissionDenial,
12
11
  assertReusableSessionRevivable,
13
12
  captureConnectedCommandOutput,
14
13
  createCodexCapacityActivities,
@@ -34,7 +33,7 @@ import {
34
33
  warnDrainSnapshotFailure,
35
34
  withFirstPartyTools,
36
35
  workflowIdForSession
37
- } from "./chunk-ZCCLJK3V.js";
36
+ } from "./chunk-RZAAGRFQ.js";
38
37
  import {
39
38
  inspectOpenSandboxKubernetesInventory,
40
39
  recordCreditBalanceGauges,
@@ -68,10 +67,8 @@ import {
68
67
  applyCreditDebitAfterUse,
69
68
  appendKnowledgeIndexChunks,
70
69
  claimKnowledgeIndexJobs,
71
- checkWorkspaceAllowance,
72
70
  completeKnowledgeIndexJob,
73
71
  continueKnowledgeIndexJob,
74
- creditDebitAttributionMetadata,
75
72
  deferKnowledgeIndexJob,
76
73
  freezeKnowledgeIndexBillingMode,
77
74
  getBillingBalance,
@@ -216,14 +213,6 @@ function createKnowledgeIndexingActivities(services, resolveDocumentServices) {
216
213
  return;
217
214
  }
218
215
  const paid = frozenPolicy.mode === "credits";
219
- if (paid && claim.billingAttribution.kind === "unknown") {
220
- observability.warn("Paid Knowledge indexing awaits initiating attribution", {
221
- errorCode: "knowledge_index_attribution_unavailable"
222
- });
223
- await deferKnowledgeIndexJob(lockedDb, claim);
224
- result.deferred++;
225
- return;
226
- }
227
216
  if (paid && current.nextIndex === 0) {
228
217
  const balance = await getBillingBalance(lockedDb, claim.accountId);
229
218
  if (balance.balanceMicros <= 0) {
@@ -232,18 +221,6 @@ function createKnowledgeIndexingActivities(services, resolveDocumentServices) {
232
221
  return;
233
222
  }
234
223
  }
235
- if (paid) {
236
- const refusal = await checkWorkspaceAllowance(lockedDb, {
237
- accountId: claim.accountId,
238
- workspaceId: current.billingWorkspaceId,
239
- subjectId: claim.billingAttribution.kind === "turn" || claim.billingAttribution.kind === "human" ? claim.billingAttribution.initiatingHumanSubjectId : null
240
- });
241
- if (refusal) {
242
- await deferKnowledgeIndexJob(lockedDb, claim);
243
- result.deferred++;
244
- return;
245
- }
246
- }
247
224
  if (settings.usageLimitsMode === "static" || settings.usageLimitsMode === "managed") {
248
225
  const limit = configuredStaticUsageLimits(settings).maxDocumentIndexedChunksPerWorkspace;
249
226
  if (limit) {
@@ -342,7 +319,6 @@ function createKnowledgeIndexingActivities(services, resolveDocumentServices) {
342
319
  sourceId: claim.revisionId,
343
320
  idempotencyKey: `knowledge.embedding:${claim.revisionId}:${claim.generation}:${current.nextIndex}`,
344
321
  metadata: {
345
- ...creditDebitAttributionMetadata(claim.billingAttribution),
346
322
  model: claim.model,
347
323
  bytes,
348
324
  chunks: chunks.length,
@@ -489,6 +465,69 @@ import {
489
465
  settleAutomationRun
490
466
  } from "@opengeni/db";
491
467
  import { SessionSkills } from "@opengeni/contracts";
468
+
469
+ // src/activities/agent-run-admission.ts
470
+ import { configuredStaticUsageLimits as configuredStaticUsageLimits2 } from "@opengeni/config";
471
+ import { modelFundingForAdmission } from "@opengeni/core";
472
+ import { getBillingBalance as getBillingBalance2, isCodexBilledTurn, sumUsageQuantity as sumUsageQuantity2 } from "@opengeni/db";
473
+ async function agentRunAdmissionDenial(services, input) {
474
+ const codexBilled = await isCodexBilledTurn({
475
+ db: services.db,
476
+ settings: services.settings,
477
+ workspaceId: input.workspaceId,
478
+ model: input.model
479
+ });
480
+ const externallyBilled = modelFundingForAdmission(
481
+ services.settings,
482
+ input.model,
483
+ codexBilled
484
+ ).fundedWithoutCredits;
485
+ if (!externallyBilled && (services.settings.billingMode === "stripe" || services.settings.usageLimitsMode === "managed")) {
486
+ if (services.entitlements) {
487
+ const decision = await services.entitlements.admitRun({
488
+ accountId: input.accountId,
489
+ workspaceId: input.workspaceId,
490
+ action: "agent_run:create",
491
+ quantity: input.requestedAgentRuns
492
+ });
493
+ if (!decision.allowed) return "insufficient_credits";
494
+ } else {
495
+ const balance = await getBillingBalance2(services.db, input.accountId);
496
+ if (balance.balanceMicros <= 0) return "insufficient_credits";
497
+ }
498
+ }
499
+ if (services.settings.usageLimitsMode !== "static" && services.settings.usageLimitsMode !== "managed") {
500
+ return null;
501
+ }
502
+ const limits = configuredStaticUsageLimits2(services.settings);
503
+ if (!externallyBilled && limits.maxMonthlyCostMicrosPerAccount) {
504
+ const used = await sumUsageQuantity2(services.db, {
505
+ accountId: input.accountId,
506
+ eventType: "model.cost",
507
+ since: startOfUtcMonth()
508
+ });
509
+ if (used >= limits.maxMonthlyCostMicrosPerAccount) {
510
+ return "monthly_model_cost_limit";
511
+ }
512
+ }
513
+ if (limits.maxMonthlyAgentRunsPerWorkspace) {
514
+ const used = await sumUsageQuantity2(services.db, {
515
+ workspaceId: input.workspaceId,
516
+ eventType: "agent_run.created",
517
+ since: startOfUtcMonth()
518
+ });
519
+ if (used + input.requestedAgentRuns > limits.maxMonthlyAgentRunsPerWorkspace) {
520
+ return "monthly_agent_run_limit";
521
+ }
522
+ }
523
+ return null;
524
+ }
525
+ function startOfUtcMonth() {
526
+ const now = /* @__PURE__ */ new Date();
527
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1));
528
+ }
529
+
530
+ // src/activities/automations.ts
492
531
  function createAutomationActivities(services, options = {}) {
493
532
  const claim = options.claim ?? claimAutomationRun;
494
533
  const settle = options.settle ?? settleAutomationRun;
@@ -5660,8 +5699,7 @@ function createScheduledTaskActivities(services) {
5660
5699
  accountId: task.accountId,
5661
5700
  workspaceId: task.workspaceId,
5662
5701
  model: targetSessionExecution?.model ?? model,
5663
- requestedAgentRuns: input.agentRunUsageIdempotencyKey ? 0 : 1,
5664
- initiatingHumanSubjectId: causalHumanSubjectId
5702
+ requestedAgentRuns: input.agentRunUsageIdempotencyKey ? 0 : 1
5665
5703
  }
5666
5704
  );
5667
5705
  if (admissionDenial) {
@@ -7981,4 +8019,4 @@ export {
7981
8019
  createControlActivities,
7982
8020
  createControlActivitiesFromServices
7983
8021
  };
7984
- //# sourceMappingURL=activities-control-YKXRDVMB.js.map
8022
+ //# sourceMappingURL=activities-control-MHNA3CYV.js.map