@polpo-ai/core 0.15.144 → 0.16.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 (172) hide show
  1. package/README.md +30 -0
  2. package/dist/__tests__/custom-tool-runner.test.d.ts +2 -0
  3. package/dist/__tests__/custom-tool-runner.test.d.ts.map +1 -0
  4. package/dist/__tests__/custom-tool-runner.test.js +121 -0
  5. package/dist/__tests__/custom-tool-runner.test.js.map +1 -0
  6. package/dist/__tests__/mcp-runner-client.test.d.ts +2 -0
  7. package/dist/__tests__/mcp-runner-client.test.d.ts.map +1 -0
  8. package/dist/__tests__/mcp-runner-client.test.js +144 -0
  9. package/dist/__tests__/mcp-runner-client.test.js.map +1 -0
  10. package/dist/__tests__/mission-execution.test.d.ts +2 -0
  11. package/dist/__tests__/mission-execution.test.d.ts.map +1 -0
  12. package/dist/__tests__/mission-execution.test.js +68 -0
  13. package/dist/__tests__/mission-execution.test.js.map +1 -0
  14. package/dist/__tests__/run-state-monitor.test.d.ts +2 -0
  15. package/dist/__tests__/run-state-monitor.test.d.ts.map +1 -0
  16. package/dist/__tests__/run-state-monitor.test.js +59 -0
  17. package/dist/__tests__/run-state-monitor.test.js.map +1 -0
  18. package/dist/__tests__/runtime-metadata.test.d.ts +2 -0
  19. package/dist/__tests__/runtime-metadata.test.d.ts.map +1 -0
  20. package/dist/__tests__/runtime-metadata.test.js +17 -0
  21. package/dist/__tests__/runtime-metadata.test.js.map +1 -0
  22. package/dist/__tests__/task-execution-router.test.js +1 -1
  23. package/dist/__tests__/task-execution-router.test.js.map +1 -1
  24. package/dist/__tests__/task-runner-agent-lifetime.test.d.ts +2 -0
  25. package/dist/__tests__/task-runner-agent-lifetime.test.d.ts.map +1 -0
  26. package/dist/__tests__/task-runner-agent-lifetime.test.js +136 -0
  27. package/dist/__tests__/task-runner-agent-lifetime.test.js.map +1 -0
  28. package/dist/adapter.d.ts +18 -0
  29. package/dist/adapter.d.ts.map +1 -1
  30. package/dist/agent-manager.d.ts +3 -0
  31. package/dist/agent-manager.d.ts.map +1 -1
  32. package/dist/agent-manager.js +28 -2
  33. package/dist/agent-manager.js.map +1 -1
  34. package/dist/agent-store.d.ts +70 -1
  35. package/dist/agent-store.d.ts.map +1 -1
  36. package/dist/agent-store.js +103 -1
  37. package/dist/agent-store.js.map +1 -1
  38. package/dist/approval-manager.d.ts +24 -4
  39. package/dist/approval-manager.d.ts.map +1 -1
  40. package/dist/approval-manager.js +160 -112
  41. package/dist/approval-manager.js.map +1 -1
  42. package/dist/approval-manager.test.d.ts +2 -0
  43. package/dist/approval-manager.test.d.ts.map +1 -0
  44. package/dist/approval-manager.test.js +116 -0
  45. package/dist/approval-manager.test.js.map +1 -0
  46. package/dist/assessment-orchestrator.d.ts +12 -1
  47. package/dist/assessment-orchestrator.d.ts.map +1 -1
  48. package/dist/assessment-orchestrator.js +181 -83
  49. package/dist/assessment-orchestrator.js.map +1 -1
  50. package/dist/custom-tool-runner.d.ts +56 -0
  51. package/dist/custom-tool-runner.d.ts.map +1 -0
  52. package/dist/custom-tool-runner.js +197 -0
  53. package/dist/custom-tool-runner.js.map +1 -0
  54. package/dist/escalation-manager.d.ts +2 -0
  55. package/dist/escalation-manager.d.ts.map +1 -1
  56. package/dist/escalation-manager.js +79 -25
  57. package/dist/escalation-manager.js.map +1 -1
  58. package/dist/events.d.ts +4 -0
  59. package/dist/events.d.ts.map +1 -1
  60. package/dist/hooks.d.ts.map +1 -1
  61. package/dist/hooks.js +6 -0
  62. package/dist/hooks.js.map +1 -1
  63. package/dist/index.d.ts +19 -3
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +13 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/mcp-capability.d.ts +40 -0
  68. package/dist/mcp-capability.d.ts.map +1 -0
  69. package/dist/mcp-capability.js +2 -0
  70. package/dist/mcp-capability.js.map +1 -0
  71. package/dist/mcp-runner.d.ts +45 -0
  72. package/dist/mcp-runner.d.ts.map +1 -0
  73. package/dist/mcp-runner.js +238 -0
  74. package/dist/mcp-runner.js.map +1 -0
  75. package/dist/mission-cancellation.d.ts +14 -0
  76. package/dist/mission-cancellation.d.ts.map +1 -0
  77. package/dist/mission-cancellation.js +43 -0
  78. package/dist/mission-cancellation.js.map +1 -0
  79. package/dist/mission-execution.d.ts +103 -0
  80. package/dist/mission-execution.d.ts.map +1 -0
  81. package/dist/mission-execution.js +196 -0
  82. package/dist/mission-execution.js.map +1 -0
  83. package/dist/mission-executor.d.ts +18 -16
  84. package/dist/mission-executor.d.ts.map +1 -1
  85. package/dist/mission-executor.js +339 -203
  86. package/dist/mission-executor.js.map +1 -1
  87. package/dist/mission-gating.d.ts +11 -15
  88. package/dist/mission-gating.d.ts.map +1 -1
  89. package/dist/mission-gating.js +25 -33
  90. package/dist/mission-gating.js.map +1 -1
  91. package/dist/mission-inspection.d.ts +29 -0
  92. package/dist/mission-inspection.d.ts.map +1 -0
  93. package/dist/mission-inspection.js +99 -0
  94. package/dist/mission-inspection.js.map +1 -0
  95. package/dist/mission-store.d.ts +7 -0
  96. package/dist/mission-store.d.ts.map +1 -1
  97. package/dist/mission-store.js +8 -0
  98. package/dist/mission-store.js.map +1 -1
  99. package/dist/orchestrator-context.d.ts +3 -0
  100. package/dist/orchestrator-context.d.ts.map +1 -1
  101. package/dist/orchestrator-engine.d.ts +39 -39
  102. package/dist/orchestrator-engine.d.ts.map +1 -1
  103. package/dist/orchestrator-engine.js +124 -24
  104. package/dist/orchestrator-engine.js.map +1 -1
  105. package/dist/run-state-monitor.d.ts +14 -0
  106. package/dist/run-state-monitor.d.ts.map +1 -0
  107. package/dist/run-state-monitor.js +63 -0
  108. package/dist/run-state-monitor.js.map +1 -0
  109. package/dist/run-store.d.ts +15 -0
  110. package/dist/run-store.d.ts.map +1 -1
  111. package/dist/runner-capability.d.ts +43 -0
  112. package/dist/runner-capability.d.ts.map +1 -0
  113. package/dist/runner-capability.js +55 -0
  114. package/dist/runner-capability.js.map +1 -0
  115. package/dist/runtime-metadata.d.ts +5 -0
  116. package/dist/runtime-metadata.d.ts.map +1 -0
  117. package/dist/runtime-metadata.js +21 -0
  118. package/dist/runtime-metadata.js.map +1 -0
  119. package/dist/scheduler.d.ts +2 -1
  120. package/dist/scheduler.d.ts.map +1 -1
  121. package/dist/scheduler.js +16 -6
  122. package/dist/scheduler.js.map +1 -1
  123. package/dist/schemas.d.ts +8 -6
  124. package/dist/schemas.d.ts.map +1 -1
  125. package/dist/schemas.js +10 -0
  126. package/dist/schemas.js.map +1 -1
  127. package/dist/spawner.d.ts +12 -0
  128. package/dist/spawner.d.ts.map +1 -1
  129. package/dist/steering.d.ts +4 -1
  130. package/dist/steering.d.ts.map +1 -1
  131. package/dist/steering.js.map +1 -1
  132. package/dist/task-approval-coordinator.d.ts +29 -0
  133. package/dist/task-approval-coordinator.d.ts.map +1 -0
  134. package/dist/task-approval-coordinator.js +216 -0
  135. package/dist/task-approval-coordinator.js.map +1 -0
  136. package/dist/task-dispatch.d.ts +40 -0
  137. package/dist/task-dispatch.d.ts.map +1 -0
  138. package/dist/task-dispatch.js +136 -0
  139. package/dist/task-dispatch.js.map +1 -0
  140. package/dist/task-execution.d.ts +146 -0
  141. package/dist/task-execution.d.ts.map +1 -0
  142. package/dist/task-execution.js +357 -0
  143. package/dist/task-execution.js.map +1 -0
  144. package/dist/task-manager.d.ts +31 -22
  145. package/dist/task-manager.d.ts.map +1 -1
  146. package/dist/task-manager.js +74 -7
  147. package/dist/task-manager.js.map +1 -1
  148. package/dist/task-runner.d.ts +30 -3
  149. package/dist/task-runner.d.ts.map +1 -1
  150. package/dist/task-runner.js +429 -90
  151. package/dist/task-runner.js.map +1 -1
  152. package/dist/task-store.d.ts +9 -3
  153. package/dist/task-store.d.ts.map +1 -1
  154. package/dist/tool-invocation.d.ts +4 -0
  155. package/dist/tool-invocation.d.ts.map +1 -1
  156. package/dist/tool-invocation.js +8 -1
  157. package/dist/tool-invocation.js.map +1 -1
  158. package/dist/tool-invocation.test.d.ts +2 -0
  159. package/dist/tool-invocation.test.d.ts.map +1 -0
  160. package/dist/tool-invocation.test.js +40 -0
  161. package/dist/tool-invocation.test.js.map +1 -0
  162. package/dist/types/agent.d.ts +4 -0
  163. package/dist/types/agent.d.ts.map +1 -1
  164. package/dist/types/agent.js.map +1 -1
  165. package/dist/types/config.d.ts +3 -0
  166. package/dist/types/config.d.ts.map +1 -1
  167. package/dist/types/config.js.map +1 -1
  168. package/dist/types/mission.d.ts +23 -1
  169. package/dist/types/mission.d.ts.map +1 -1
  170. package/dist/types/task.d.ts +10 -0
  171. package/dist/types/task.d.ts.map +1 -1
  172. package/package.json +17 -1
@@ -0,0 +1,40 @@
1
+ import type { ToolInvocationContext } from "./tool-invocation.js";
2
+ import type { McpServerConfig } from "./types/agent.js";
3
+ /** Non-secret tool inventory verified by the host. Discovery grants no access. */
4
+ export interface McpCapabilityTool {
5
+ readonly name: string;
6
+ readonly description?: string;
7
+ readonly inputSchema: Readonly<Record<string, unknown>>;
8
+ }
9
+ export interface McpCapabilityResolveInput {
10
+ readonly serverName: string;
11
+ readonly toolName: string;
12
+ readonly toolCallId: string;
13
+ readonly invocation: ToolInvocationContext;
14
+ readonly signal?: AbortSignal;
15
+ }
16
+ /** One acquired account and one authorized MCP operation. HTTP destinations,
17
+ * credentials and physical Connection identifiers remain entirely host-owned. */
18
+ export interface ResolvedMcpCapability {
19
+ call(arguments_: Record<string, unknown>): Promise<unknown>;
20
+ dispose(): void | Promise<void>;
21
+ }
22
+ export interface McpCapabilityResolver {
23
+ resolve(input: McpCapabilityResolveInput): Promise<ResolvedMcpCapability>;
24
+ }
25
+ export interface McpRuntimeCapabilityProvider {
26
+ readonly tools: readonly McpCapabilityTool[];
27
+ readonly resolver: McpCapabilityResolver;
28
+ /** Host-only diagnostics; raw errors must never enter model tool results.
29
+ * The host applies its own redaction before persisting audit/log records. */
30
+ readonly onError?: (error: unknown, input: McpCapabilityResolveInput) => void | Promise<void>;
31
+ }
32
+ export type McpRuntimeCapabilities = Readonly<Record<string, McpRuntimeCapabilityProvider>>;
33
+ /** Process-local host port. Inventory is non-secret and authorizes no call. */
34
+ export type ResolveMcpRuntimeCapabilities = (input: {
35
+ agentName: string;
36
+ mcpServers?: Readonly<Record<string, McpServerConfig>>;
37
+ invocation: ToolInvocationContext;
38
+ signal?: AbortSignal;
39
+ }) => McpRuntimeCapabilities | Promise<McpRuntimeCapabilities>;
40
+ //# sourceMappingURL=mcp-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-capability.d.ts","sourceRoot":"","sources":["../src/mcp-capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED;iFACiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IACzC;iFAC6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/F;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC;AAE5F,+EAA+E;AAC/E,MAAM,MAAM,6BAA6B,GAAG,CAAC,KAAK,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACvD,UAAU,EAAE,qBAAqB,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,KAAK,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-capability.js","sourceRoot":"","sources":["../src/mcp-capability.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { z } from "zod";
2
+ import type { ResolveMcpRuntimeCapabilities } from "./mcp-capability.js";
3
+ export declare const MCP_RUNNER_LEASE_VERSION = 2;
4
+ export declare const MAX_MCP_RUNNER_REQUEST_BYTES: number;
5
+ export declare const MAX_MCP_RUNNER_RESPONSE_BYTES: number;
6
+ export declare const MCP_RUNNER_REQUEST_TIMEOUT_MS = 30000;
7
+ /** Host-to-process bootstrap, never part of persisted RunnerConfig or model input.
8
+ * The bearer authorizes a run lease, not a provider account or provider URL. */
9
+ export declare const McpRunnerLeasePayloadSchema: z.ZodObject<{
10
+ version: z.ZodLiteral<2>;
11
+ url: z.ZodString;
12
+ token: z.ZodString;
13
+ sandboxId: z.ZodString;
14
+ agentName: z.ZodString;
15
+ agentIdentity: z.ZodPipe<z.ZodUnknown, z.ZodTransform<import("./agent-store.js").AgentIdentity, unknown>>;
16
+ runId: z.ZodString;
17
+ expiresAt: z.ZodISODateTime;
18
+ }, z.core.$strict>;
19
+ export type McpRunnerLeasePayload = z.infer<typeof McpRunnerLeasePayloadSchema>;
20
+ /** No identity, destination, credential or permission overrides from the runner. */
21
+ export declare const McpRunnerRequestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
22
+ operation: z.ZodLiteral<"inventory">;
23
+ }, z.core.$strict>, z.ZodObject<{
24
+ operation: z.ZodLiteral<"call">;
25
+ capability: z.ZodString;
26
+ toolCallId: z.ZodString;
27
+ arguments: z.ZodRecord<z.ZodString, z.ZodUnknown>;
28
+ }, z.core.$strict>], "operation">;
29
+ export type McpRunnerRequest = z.infer<typeof McpRunnerRequestSchema>;
30
+ export declare const McpRunnerInventorySchema: z.ZodArray<z.ZodObject<{
31
+ serverName: z.ZodString;
32
+ tools: z.ZodArray<z.ZodObject<{
33
+ name: z.ZodString;
34
+ description: z.ZodOptional<z.ZodString>;
35
+ inputSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
36
+ }, z.core.$strict>>;
37
+ }, z.core.$strict>>;
38
+ export type McpRunnerInventory = z.infer<typeof McpRunnerInventorySchema>;
39
+ /** Remote implementation of the process-local MCP port. Provider refresh,
40
+ * account selection and native MCP sessions stay on the trusted broker. */
41
+ export declare function createRemoteMcpRuntimeCapabilities(input: McpRunnerLeasePayload, options?: {
42
+ fetch?: typeof globalThis.fetch;
43
+ allowLoopbackHttp?: boolean;
44
+ }): ResolveMcpRuntimeCapabilities;
45
+ //# sourceMappingURL=mcp-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runner.d.ts","sourceRoot":"","sources":["../src/mcp-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAIzE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,eAAO,MAAM,4BAA4B,QAAa,CAAC;AACvD,eAAO,MAAM,6BAA6B,QAAkB,CAAC;AAC7D,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAIpD;gFACgF;AAChF,eAAO,MAAM,2BAA2B;;;;;;;;;kBAY2E,CAAC;AACpH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,oFAAoF;AACpF,eAAO,MAAM,sBAAsB;;;;;;;iCAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,wBAAwB;;;;;;;mBAgBnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AA8D1E;2EAC2E;AAC3E,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7E,6BAA6B,CAoF/B"}
@@ -0,0 +1,238 @@
1
+ import { z } from "zod";
2
+ import { ConnectionSelectionError } from "./connection-capability.js";
3
+ import { normalizeAgentIdentity } from "./agent-store.js";
4
+ import { createToolInvocationContext } from "./tool-invocation.js";
5
+ export const MCP_RUNNER_LEASE_VERSION = 2;
6
+ export const MAX_MCP_RUNNER_REQUEST_BYTES = 256 * 1024;
7
+ export const MAX_MCP_RUNNER_RESPONSE_BYTES = 2 * 1024 * 1024;
8
+ export const MCP_RUNNER_REQUEST_TIMEOUT_MS = 30_000;
9
+ const name = z.string().min(1).max(256).regex(/^[A-Za-z0-9_.-]+$/);
10
+ const identifier = z.string().min(1).max(512).refine(value => value.trim() === value && !/[\u0000-\u001f\u007f]/.test(value));
11
+ /** Host-to-process bootstrap, never part of persisted RunnerConfig or model input.
12
+ * The bearer authorizes a run lease, not a provider account or provider URL. */
13
+ export const McpRunnerLeasePayloadSchema = z.object({
14
+ version: z.literal(MCP_RUNNER_LEASE_VERSION),
15
+ url: z.string().min(1).max(2048),
16
+ token: z.string().min(1).max(512).regex(/^[A-Za-z0-9_-]+$/),
17
+ sandboxId: identifier,
18
+ agentName: identifier,
19
+ agentIdentity: z.unknown().transform((value, context) => {
20
+ try {
21
+ return normalizeAgentIdentity(value);
22
+ }
23
+ catch {
24
+ context.addIssue({ code: "custom", message: "Invalid agent identity" });
25
+ return z.NEVER;
26
+ }
27
+ }),
28
+ runId: identifier,
29
+ expiresAt: z.iso.datetime(),
30
+ }).strict().refine(value => value.agentIdentity.name === value.agentName, { message: "Mismatched agent identity" });
31
+ /** No identity, destination, credential or permission overrides from the runner. */
32
+ export const McpRunnerRequestSchema = z.discriminatedUnion("operation", [
33
+ z.object({ operation: z.literal("inventory") }).strict(),
34
+ z.object({ operation: z.literal("call"), capability: z.string().min(1).max(1024),
35
+ toolCallId: identifier, arguments: z.record(z.string(), z.unknown()) }).strict(),
36
+ ]);
37
+ export const McpRunnerInventorySchema = z.array(z.object({
38
+ serverName: name,
39
+ tools: z.array(z.object({ name, description: z.string().max(32_768).optional(),
40
+ inputSchema: z.record(z.string(), z.unknown()) }).strict()).max(512),
41
+ }).strict()).max(128).superRefine((inventory, ctx) => {
42
+ const servers = new Set();
43
+ const capabilities = new Set();
44
+ for (const entry of inventory) {
45
+ if (servers.has(entry.serverName))
46
+ ctx.addIssue({ code: "custom", message: "Duplicate MCP namespace" });
47
+ servers.add(entry.serverName);
48
+ for (const tool of entry.tools) {
49
+ const capability = `mcp__${entry.serverName}__${tool.name}`;
50
+ if (capabilities.has(capability))
51
+ ctx.addIssue({ code: "custom", message: "Ambiguous MCP capability" });
52
+ capabilities.add(capability);
53
+ }
54
+ }
55
+ });
56
+ const unavailable = () => new ConnectionSelectionError("connection_scope_denied", "MCP capability is no longer available");
57
+ const failed = () => new Error("MCP broker request failed");
58
+ class McpDispatchLimitError extends Error {
59
+ retryAfterSeconds;
60
+ code = "rate_limited";
61
+ constructor(retryAfterSeconds) {
62
+ super(`Connection request limit exceeded; retry after ${retryAfterSeconds} seconds`);
63
+ this.retryAfterSeconds = retryAfterSeconds;
64
+ }
65
+ }
66
+ function bounded(signal, work) {
67
+ return new Promise((resolve, reject) => {
68
+ if (signal.aborted) {
69
+ reject(unavailable());
70
+ return;
71
+ }
72
+ const abort = () => reject(unavailable());
73
+ signal.addEventListener("abort", abort, { once: true });
74
+ Promise.resolve().then(() => {
75
+ if (signal.aborted)
76
+ throw unavailable();
77
+ return work();
78
+ }).then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
79
+ });
80
+ }
81
+ async function responseJson(response, signal) {
82
+ if ((!response.ok && response.status !== 429) || Number(response.headers.get("content-length")) > MAX_MCP_RUNNER_RESPONSE_BYTES) {
83
+ void response.body?.cancel().catch(() => undefined);
84
+ throw failed();
85
+ }
86
+ if (!response.body)
87
+ throw failed();
88
+ const reader = response.body.getReader();
89
+ const chunks = [];
90
+ let size = 0;
91
+ try {
92
+ while (true) {
93
+ const chunk = await bounded(signal, () => reader.read());
94
+ if (chunk.done)
95
+ break;
96
+ size += chunk.value.byteLength;
97
+ if (size > MAX_MCP_RUNNER_RESPONSE_BYTES)
98
+ throw failed();
99
+ chunks.push(chunk.value);
100
+ }
101
+ }
102
+ finally {
103
+ void reader.cancel().catch(() => undefined);
104
+ }
105
+ const bytes = new Uint8Array(size);
106
+ let offset = 0;
107
+ for (const chunk of chunks) {
108
+ bytes.set(chunk, offset);
109
+ offset += chunk.byteLength;
110
+ }
111
+ const envelope = JSON.parse(new TextDecoder().decode(bytes));
112
+ if (response.status === 429) {
113
+ const retry = envelope?.error?.retryAfterSeconds;
114
+ if (envelope?.ok === false && envelope.error?.code === "rate_limited"
115
+ && typeof retry === "number" && Number.isSafeInteger(retry) && retry >= 1 && retry <= 86400) {
116
+ // Only this allowlisted code and validated integer may cross the broker.
117
+ // Never reflect the remote message, details, URL or other envelope fields.
118
+ throw new McpDispatchLimitError(retry);
119
+ }
120
+ throw failed();
121
+ }
122
+ if (!envelope || envelope.ok !== true || !Object.hasOwn(envelope, "data")
123
+ || Object.keys(envelope).some(key => key !== "ok" && key !== "data"))
124
+ throw failed();
125
+ return envelope.data;
126
+ }
127
+ /** Remote implementation of the process-local MCP port. Provider refresh,
128
+ * account selection and native MCP sessions stay on the trusted broker. */
129
+ export function createRemoteMcpRuntimeCapabilities(input, options = {}) {
130
+ const parsed = McpRunnerLeasePayloadSchema.safeParse(input);
131
+ if (!parsed.success)
132
+ throw failed();
133
+ const lease = Object.freeze(parsed.data);
134
+ let url;
135
+ try {
136
+ url = new URL(lease.url);
137
+ }
138
+ catch {
139
+ throw failed();
140
+ }
141
+ const loopback = options.allowLoopbackHttp && url.protocol === "http:"
142
+ && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
143
+ if ((url.protocol !== "https:" && !loopback) || url.username || url.password || url.search || url.hash)
144
+ throw failed();
145
+ const endpoint = url.toString();
146
+ const fetcher = options.fetch ?? globalThis.fetch;
147
+ const expiresAt = Date.parse(lease.expiresAt);
148
+ const assertActive = () => { if (expiresAt <= Date.now())
149
+ throw unavailable(); };
150
+ const assertInvocation = (value) => {
151
+ let invocation;
152
+ try {
153
+ invocation = createToolInvocationContext(value);
154
+ }
155
+ catch {
156
+ throw unavailable();
157
+ }
158
+ if (invocation.runId !== lease.runId || invocation.agent?.name !== lease.agentIdentity.name
159
+ || invocation.agent.incarnation !== lease.agentIdentity.incarnation)
160
+ throw unavailable();
161
+ };
162
+ const send = async (request, signals = []) => {
163
+ assertActive();
164
+ const controller = new AbortController();
165
+ const abort = () => controller.abort();
166
+ const timer = setTimeout(abort, Math.min(MCP_RUNNER_REQUEST_TIMEOUT_MS, expiresAt - Date.now()));
167
+ for (const signal of signals) {
168
+ signal?.addEventListener("abort", abort, { once: true });
169
+ if (signal?.aborted)
170
+ abort();
171
+ }
172
+ try {
173
+ const body = JSON.stringify(McpRunnerRequestSchema.parse(request));
174
+ if (new TextEncoder().encode(body).byteLength > MAX_MCP_RUNNER_REQUEST_BYTES)
175
+ throw failed();
176
+ const response = await bounded(controller.signal, async () => {
177
+ const response = await fetcher(endpoint, {
178
+ method: "POST", redirect: "error", signal: controller.signal,
179
+ headers: { "content-type": "application/json", authorization: `Bearer ${lease.token}`, "x-polpo-sandbox-id": lease.sandboxId },
180
+ body,
181
+ });
182
+ if (controller.signal.aborted) {
183
+ void response.body?.cancel().catch(() => undefined);
184
+ throw unavailable();
185
+ }
186
+ return response;
187
+ });
188
+ return await responseJson(response, controller.signal);
189
+ }
190
+ catch (error) {
191
+ // No response body, raw URL, fetch exception or bearer in model-visible errors.
192
+ if (!controller.signal.aborted && error instanceof McpDispatchLimitError)
193
+ throw error;
194
+ throw controller.signal.aborted ? unavailable() : failed();
195
+ }
196
+ finally {
197
+ clearTimeout(timer);
198
+ for (const signal of signals)
199
+ signal?.removeEventListener("abort", abort);
200
+ }
201
+ };
202
+ return async (input) => {
203
+ assertActive();
204
+ if (input.agentName !== lease.agentName)
205
+ throw unavailable();
206
+ assertInvocation(input.invocation);
207
+ const parsedInventory = McpRunnerInventorySchema.safeParse(await send({ operation: "inventory" }, [input.signal]));
208
+ if (!parsedInventory.success)
209
+ throw failed();
210
+ return Object.fromEntries(parsedInventory.data.map(entry => [entry.serverName, {
211
+ tools: entry.tools,
212
+ resolver: {
213
+ resolve: async (request) => {
214
+ assertActive();
215
+ assertInvocation(request.invocation);
216
+ if (request.signal?.aborted || request.serverName !== entry.serverName
217
+ || !entry.tools.some(tool => tool.name === request.toolName))
218
+ throw unavailable();
219
+ const controller = new AbortController();
220
+ const capability = `mcp__${entry.serverName}__${request.toolName}`;
221
+ const toolCallId = request.toolCallId;
222
+ const signal = request.signal;
223
+ let used = false;
224
+ return {
225
+ async call(arguments_) {
226
+ if (used || controller.signal.aborted)
227
+ throw unavailable();
228
+ used = true;
229
+ return send({ operation: "call", capability, toolCallId, arguments: arguments_ }, [signal, controller.signal]);
230
+ },
231
+ dispose: () => controller.abort(),
232
+ };
233
+ },
234
+ },
235
+ }]));
236
+ };
237
+ }
238
+ //# sourceMappingURL=mcp-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runner.js","sourceRoot":"","sources":["../src/mcp-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { MissionStore } from "./mission-store.js";
2
+ import type { TaskStore } from "./task-store.js";
3
+ import { type MissionAbortOptions, type MissionAbortResult, type MissionExecutionStore } from "./mission-execution.js";
4
+ /** Cancel accepted work from a cold host without starting schedules, restoring
5
+ * agents or dispatching unrelated Tasks. Notify returned Run owners after commit. */
6
+ export declare function cancelMissionExecution(stores: {
7
+ missionStore: Pick<MissionStore, "getMission">;
8
+ taskStore: Pick<TaskStore, "listTasks">;
9
+ missionExecutionStore?: MissionExecutionStore;
10
+ }, missionId: string, options?: MissionAbortOptions): Promise<MissionAbortResult & {
11
+ missionCancelled: boolean;
12
+ killedRunIds: string[];
13
+ }>;
14
+ //# sourceMappingURL=mission-cancellation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-cancellation.d.ts","sourceRoot":"","sources":["../src/mission-cancellation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EACL,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAGhH;qFACqF;AACrF,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC/C,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACxC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,GAAG;IAAE,gBAAgB,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgC5I"}
@@ -0,0 +1,43 @@
1
+ import { currentMissionExecutionTasks } from "./mission-inspection.js";
2
+ import { isMissionExecutionCancellationStore, MissionExecutionError, validateMissionExecutionKey } from "./mission-execution.js";
3
+ import { TaskExecutionError } from "./task-execution.js";
4
+ /** Cancel accepted work from a cold host without starting schedules, restoring
5
+ * agents or dispatching unrelated Tasks. Notify returned Run owners after commit. */
6
+ export async function cancelMissionExecution(stores, missionId, options = {}) {
7
+ const executionId = options.executionId;
8
+ validateMissionExecutionKey(missionId, "abort");
9
+ if (executionId !== undefined)
10
+ validateMissionExecutionKey(executionId, "abort");
11
+ const stored = await stores.missionStore.getMission(missionId);
12
+ if (!stored)
13
+ throw new MissionExecutionError("mission_execution_invalid", "Mission not found");
14
+ const mission = structuredClone(stored);
15
+ const persistence = stores.missionExecutionStore;
16
+ const tasks = structuredClone(await stores.taskStore.listTasks());
17
+ const selected = executionId === undefined ? await currentMissionExecutionTasks(mission, tasks, persistence) : [];
18
+ const ids = new Set(selected.map(task => task.missionExecutionId));
19
+ const target = executionId ?? (ids.size === 1 ? [...ids][0] : undefined);
20
+ if (!target) {
21
+ if (!selected.length && !mission.executionCount && mission.status === "draft")
22
+ return { aborted: 0, missionCancelled: false, killedRunIds: [] };
23
+ throw new MissionExecutionError("mission_execution_unsupported", "Mission cancellation requires an accepted execution ID; legacy group labels cannot authorize cancellation");
24
+ }
25
+ if (!isMissionExecutionCancellationStore(persistence)) {
26
+ throw new MissionExecutionError("mission_execution_unsupported", "Mission cancellation requires atomic persistence");
27
+ }
28
+ const admission = await persistence.getMissionExecutionById(target);
29
+ if (!admission || admission.receipt.missionId !== missionId || admission.receipt.executionId !== target) {
30
+ throw new MissionExecutionError("mission_execution_invalid", "Execution does not belong to this Mission");
31
+ }
32
+ // Retain the snapshots read above through the commit. Re-reading after an
33
+ // await would acquire authority over a replacement attempt unintentionally.
34
+ const current = new Map(tasks.map(task => [task.id, task]));
35
+ const conditions = admission.receipt.tasks.map(accepted => {
36
+ const snapshot = current.get(accepted.id);
37
+ if (!snapshot)
38
+ throw new TaskExecutionError("task_execution_conflict", "Accepted Mission task is missing");
39
+ return { taskId: accepted.id, snapshot };
40
+ });
41
+ return persistence.abortMissionExecution({ missionId, executionId: target, tasks: conditions });
42
+ }
43
+ //# sourceMappingURL=mission-cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-cancellation.js","sourceRoot":"","sources":["../src/mission-cancellation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { AgentConfig, Mission, ScopedNotificationRules, Task } from "./types.js";
2
+ import { type TaskExecutionPrecondition, type TaskExecutionState } from "./task-execution.js";
3
+ import type { RunRecord } from "./run-store.js";
4
+ /** Immutable admission receipt. Task snapshots describe what was created;
5
+ * callers read TaskStore separately for current execution status. */
6
+ export interface MissionExecutionReceipt {
7
+ executionId: string;
8
+ missionId: string;
9
+ idempotencyKey: string;
10
+ group: string;
11
+ sequence: number;
12
+ user?: string;
13
+ metadata?: Record<string, string>;
14
+ createdAt: string;
15
+ tasks: Task[];
16
+ }
17
+ /** Every control/inspection surface must use the same accepted task identity. */
18
+ export declare function assertMissionExecutionTask(task: Task, receipt: MissionExecutionReceipt): void;
19
+ export interface MissionExecutionCommit {
20
+ /** Mission used to plan and authorize all tasks, rechecked at admission. */
21
+ expected: Mission;
22
+ receipt: MissionExecutionReceipt;
23
+ notifications?: ScopedNotificationRules;
24
+ /** Agent definitions selected during planning, recovered only for this execution. */
25
+ runtime?: {
26
+ volatileAgents: AgentConfig[];
27
+ taskTitles?: Array<{
28
+ authored: string;
29
+ accepted: string;
30
+ }>;
31
+ };
32
+ }
33
+ /** Capability separate from ordinary Mission CRUD. Implementations must commit
34
+ * the receipt, all tasks, Mission activation and counter as one durable unit. */
35
+ export interface MissionExecutionStore {
36
+ getMissionExecution(missionId: string, idempotencyKey: string): Promise<MissionExecutionReceipt | undefined>;
37
+ getMissionExecutionById(executionId: string): Promise<MissionExecutionCommit | undefined>;
38
+ commitMissionExecution(input: MissionExecutionCommit): Promise<{
39
+ receipt: MissionExecutionReceipt;
40
+ created: boolean;
41
+ }>;
42
+ /** Finalize only the current active execution, with all accepted tasks terminal. */
43
+ finalizeMissionExecution(executionId: string, status: MissionExecutionFinalStatus): Promise<boolean>;
44
+ }
45
+ export type MissionExecutionFinalStatus = "completed" | "failed" | "scheduled" | "recurring";
46
+ /** Cancellation must commit the complete accepted Task set, its Runs and the
47
+ * current Mission status together. Per-Task cancellation followed by a separate
48
+ * finalization lets concurrent cleanup reschedule the interrupted Mission. */
49
+ export interface MissionExecutionAbortInput {
50
+ missionId: string;
51
+ executionId: string;
52
+ tasks: TaskExecutionPrecondition[];
53
+ }
54
+ export interface MissionExecutionAbortResult {
55
+ executionId: string;
56
+ aborted: number;
57
+ /** False when cancelling a historical execution of a newer active Mission. */
58
+ missionCancelled: boolean;
59
+ /** Notify only these exact owners, after the durable commit succeeds. */
60
+ killedRunIds: string[];
61
+ }
62
+ export interface MissionExecutionCancellationStore extends MissionExecutionStore {
63
+ abortMissionExecution(input: MissionExecutionAbortInput): Promise<MissionExecutionAbortResult>;
64
+ }
65
+ export declare function isMissionExecutionCancellationStore(value: unknown): value is MissionExecutionCancellationStore;
66
+ export declare function normalizeMissionExecutionAbort(input: MissionExecutionAbortInput): MissionExecutionAbortInput;
67
+ /** Shared decision, called while storage holds all Mission/Task/Run reads stable.
68
+ * The returned writes must all succeed in the SAME transaction or all roll back. */
69
+ export declare function prepareMissionExecutionAbort(input: MissionExecutionAbortInput, receipt: MissionExecutionReceipt | undefined, mission: Mission | undefined, tasks: Task[], runs: RunRecord[], now: string): {
70
+ tasks: TaskExecutionState[];
71
+ mission?: Mission;
72
+ result: MissionExecutionAbortResult;
73
+ };
74
+ export declare function validateMissionExecutionFinalStatus(status: MissionExecutionFinalStatus): void;
75
+ export interface MissionExecutionOptions {
76
+ idempotencyKey?: string;
77
+ }
78
+ export interface MissionExecutionResult {
79
+ tasks: Task[];
80
+ group: string;
81
+ executionId?: string;
82
+ }
83
+ export interface MissionAbortOptions {
84
+ executionId?: string;
85
+ }
86
+ export interface MissionAbortResult {
87
+ aborted: number;
88
+ executionId?: string;
89
+ }
90
+ export declare function isMissionExecutionStore(value: unknown): value is MissionExecutionStore;
91
+ export declare class MissionExecutionError extends Error {
92
+ readonly code: "mission_execution_invalid" | "mission_execution_conflict" | "mission_execution_unsupported";
93
+ constructor(code: "mission_execution_invalid" | "mission_execution_conflict" | "mission_execution_unsupported", message: string);
94
+ }
95
+ export declare function validateMissionExecutionKey(missionId: string, key: string): void;
96
+ /** Capture a bounded JSON copy before awaiting storage. No caller can mutate
97
+ * its principal, dependency graph or expected Mission while admission waits. */
98
+ export declare function normalizeMissionExecutionCommit(input: unknown): MissionExecutionCommit;
99
+ /** Called under the store's actual transaction/lock, after receipt lookup.
100
+ * A committed duplicate returns its original receipt before these stale-plan
101
+ * checks; changed Mission configuration never reauthorizes a replay. */
102
+ export declare function admitMissionExecution(input: MissionExecutionCommit, current: Mission | undefined, tasks: Task[]): Mission;
103
+ //# sourceMappingURL=mission-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-execution.d.ts","sourceRoot":"","sources":["../src/mission-execution.ts"],"names":[],"mappings":"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"}