@heddleagent/execution-host-client 6.0.0 → 6.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.
- package/README.md +76 -14
- package/dist/agentcore/agentcore-execution-host.d.ts +17 -0
- package/dist/agentcore/agentcore-execution-host.d.ts.map +1 -0
- package/dist/agentcore/agentcore-execution-host.js +201 -0
- package/dist/agentcore/agentcore-execution-host.js.map +1 -0
- package/dist/agentcore/index.d.ts +3 -0
- package/dist/agentcore/index.d.ts.map +1 -0
- package/dist/agentcore/index.js +2 -0
- package/dist/agentcore/index.js.map +1 -0
- package/dist/agentcore/types.d.ts +14 -0
- package/dist/agentcore/types.d.ts.map +1 -0
- package/dist/agentcore/types.js +2 -0
- package/dist/agentcore/types.js.map +1 -0
- package/dist/authority/jose-execution-authority.js +2 -2
- package/dist/authority/jose-execution-authority.js.map +1 -1
- package/dist/contracts/index.d.ts +106 -3
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +67 -2
- package/dist/contracts/index.js.map +1 -1
- package/dist/conversation/index.d.ts +1 -1
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/types.d.ts +4 -2
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/conversation/types.js.map +1 -1
- package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.d.ts +14 -0
- package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.d.ts.map +1 -0
- package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.js +38 -0
- package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.js.map +1 -0
- package/dist/heartbeat/hosted-heartbeat-task-service.d.ts +22 -0
- package/dist/heartbeat/hosted-heartbeat-task-service.d.ts.map +1 -0
- package/dist/heartbeat/hosted-heartbeat-task-service.js +96 -0
- package/dist/heartbeat/hosted-heartbeat-task-service.js.map +1 -0
- package/dist/heartbeat/index.d.ts +5 -0
- package/dist/heartbeat/index.d.ts.map +1 -0
- package/dist/heartbeat/index.js +4 -0
- package/dist/heartbeat/index.js.map +1 -0
- package/dist/heartbeat/types.d.ts +83 -0
- package/dist/heartbeat/types.d.ts.map +1 -0
- package/dist/heartbeat/types.js +17 -0
- package/dist/heartbeat/types.js.map +1 -0
- package/dist/http-sse/direct-http-execution-host.d.ts +4 -3
- package/dist/http-sse/direct-http-execution-host.d.ts.map +1 -1
- package/dist/http-sse/direct-http-execution-host.js +56 -21
- package/dist/http-sse/direct-http-execution-host.js.map +1 -1
- package/dist/http-sse/index.d.ts +1 -1
- package/dist/http-sse/index.d.ts.map +1 -1
- package/dist/http-sse/index.js.map +1 -1
- package/dist/http-sse/types.d.ts +11 -1
- package/dist/http-sse/types.d.ts.map +1 -1
- package/dist/http-sse/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +11 -1
- package/spec/v1/README.md +14 -4
- package/spec/v1/fixtures/manifest.json +12 -0
- package/spec/v1/fixtures/valid-heartbeat-request.json +23 -0
- package/spec/v1/fixtures/valid-heartbeat-result.sse +13 -0
- package/spec/v1/openapi.json +513 -6
- package/spec/v1/schema-bundle.json +499 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted-heartbeat-task-service.js","sourceRoot":"","sources":["../../src/heartbeat/hosted-heartbeat-task-service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n HEARTBEAT_TASK_WORKFLOW,\n McpAllowedToolsSchema,\n} from '../contracts/index.js';\nimport { ExecutionHostInvocationCancelledError } from '../http-sse/index.js';\nimport {\n HostedHeartbeatTaskInputSchema,\n type HostedHeartbeatTaskInput,\n type HostedHeartbeatTaskRunner,\n type HostedHeartbeatTaskServiceConfig,\n} from './types.js';\n\nexport class HostedHeartbeatConfigurationError extends Error {\n readonly name = 'HostedHeartbeatConfigurationError';\n}\n\nexport class HostedHeartbeatExecutionError extends Error {\n readonly name = 'HostedHeartbeatExecutionError';\n\n constructor(readonly code: string) {\n super('Execution Host heartbeat task failed.');\n }\n}\n\n/**\n * Provider-neutral application service for one remotely executed heartbeat.\n *\n * It owns authority issuance, optional product-tool policy, model credentials,\n * ordered stream consumption, cancellation, and terminal classification. The\n * caller owns product scope/session mapping and the durable heartbeat store.\n */\nexport class HostedHeartbeatTaskService\nimplements HostedHeartbeatTaskRunner {\n readonly #authority: HostedHeartbeatTaskServiceConfig['authority'];\n readonly #executionHost: HostedHeartbeatTaskServiceConfig['executionHost'];\n readonly #modelCredentials: HostedHeartbeatTaskServiceConfig[\n 'modelCredentials'\n ];\n readonly #allowedTools: readonly string[] | undefined;\n\n constructor(config: HostedHeartbeatTaskServiceConfig) {\n this.#authority = config.authority;\n this.#executionHost = config.executionHost;\n this.#modelCredentials = config.modelCredentials;\n this.#allowedTools = config.mcp\n ? Object.freeze(McpAllowedToolsSchema.parse(config.mcp.allowedTools))\n : undefined;\n }\n\n async execute(\n rawInput: HostedHeartbeatTaskInput,\n ): Promise<unknown> {\n const input = HostedHeartbeatTaskInputSchema.parse(rawInput);\n input.signal?.throwIfAborted();\n const issued = await this.#authority.issue({\n scope: input.scope,\n runtimeSessionId: input.runtimeSessionId,\n invocationId: input.invocationId,\n workflow: HEARTBEAT_TASK_WORKFLOW,\n ...(this.#allowedTools\n ? { mcp: { allowedTools: this.#allowedTools } }\n : {}),\n });\n const mcpCapability = issued.mcpCapability();\n if (this.#allowedTools && !mcpCapability) {\n throw new HostedHeartbeatConfigurationError(\n 'Hosted heartbeat tool policy requires an MCP-capable execution authority.',\n );\n }\n const modelApiKey = await this.#modelCredentials.resolveModelApiKey({\n scope: input.scope,\n invocationId: input.invocationId,\n signal: input.signal,\n });\n input.signal?.throwIfAborted();\n\n for await (const event of this.#executionHost.streamHeartbeatTask({\n invocationId: input.invocationId,\n runtimeSessionId: input.runtimeSessionId,\n taskId: input.taskId,\n task: input.task,\n ...(input.checkpoint ? { checkpoint: input.checkpoint } : {}),\n runContext: input.runContext,\n ...(input.model ? { model: input.model } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.maxSteps !== undefined ? { maxSteps: input.maxSteps } : {}),\n ...(input.searchIgnoreDirs\n ? { searchIgnoreDirs: input.searchIgnoreDirs }\n : {}),\n ...(input.systemContext ? { systemContext: input.systemContext } : {}),\n ...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),\n ...(input.signal ? { signal: input.signal } : {}),\n executionAssertion: issued.executionAssertion(),\n ...(mcpCapability ? { mcpCapability } : {}),\n modelApiKey,\n })) {\n if (event.kind === 'activity') {\n input.publishActivity?.(event.activity);\n continue;\n }\n if (event.kind === 'result') {\n return event.result;\n }\n if (event.kind === 'cancelled') {\n throw new ExecutionHostInvocationCancelledError();\n }\n if (event.kind === 'error') {\n throw new HostedHeartbeatExecutionError(event.error.code);\n }\n }\n throw new HostedHeartbeatExecutionError('missing_terminal_result');\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { HostedHeartbeatConfigurationError, HostedHeartbeatExecutionError, HostedHeartbeatTaskService, } from './hosted-heartbeat-task-service.js';
|
|
2
|
+
export { HostedHeartbeatAgentExecutionTransport } from './hosted-heartbeat-agent-execution-transport.js';
|
|
3
|
+
export { HostedHeartbeatInvocationContextSchema, HostedHeartbeatTaskInputSchema, } from './types.js';
|
|
4
|
+
export type { HostedHeartbeatAgentExecutionRequest, HostedHeartbeatAgentExecutionTransportConfig, HostedHeartbeatAgentExecutionTransportInput, HostedHeartbeatInvocationContext, HostedHeartbeatTaskInput, HostedHeartbeatTaskRunner, HostedHeartbeatTaskServiceConfig, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/heartbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,sCAAsC,EAAE,MAAM,iDAAiD,CAAC;AACzG,OAAO,EACL,sCAAsC,EACtC,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oCAAoC,EACpC,4CAA4C,EAC5C,2CAA2C,EAC3C,gCAAgC,EAChC,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { HostedHeartbeatConfigurationError, HostedHeartbeatExecutionError, HostedHeartbeatTaskService, } from './hosted-heartbeat-task-service.js';
|
|
2
|
+
export { HostedHeartbeatAgentExecutionTransport } from './hosted-heartbeat-agent-execution-transport.js';
|
|
3
|
+
export { HostedHeartbeatInvocationContextSchema, HostedHeartbeatTaskInputSchema, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/heartbeat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,sCAAsC,EAAE,MAAM,iDAAiD,CAAC;AACzG,OAAO,EACL,sCAAsC,EACtC,8BAA8B,GAC/B,MAAM,YAAY,CAAC","sourcesContent":["export {\n HostedHeartbeatConfigurationError,\n HostedHeartbeatExecutionError,\n HostedHeartbeatTaskService,\n} from './hosted-heartbeat-task-service.js';\nexport { HostedHeartbeatAgentExecutionTransport } from './hosted-heartbeat-agent-execution-transport.js';\nexport {\n HostedHeartbeatInvocationContextSchema,\n HostedHeartbeatTaskInputSchema,\n} from './types.js';\nexport type {\n HostedHeartbeatAgentExecutionRequest,\n HostedHeartbeatAgentExecutionTransportConfig,\n HostedHeartbeatAgentExecutionTransportInput,\n HostedHeartbeatInvocationContext,\n HostedHeartbeatTaskInput,\n HostedHeartbeatTaskRunner,\n HostedHeartbeatTaskServiceConfig,\n} from './types.js';\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ExecutionAuthority } from '../authority/index.js';
|
|
3
|
+
import type { HostedModelCredentialProvider } from '../conversation/index.js';
|
|
4
|
+
import type { HeartbeatExecutionHost } from '../http-sse/index.js';
|
|
5
|
+
export declare const HostedHeartbeatTaskInputSchema: z.ZodObject<{
|
|
6
|
+
invocationId: z.ZodString;
|
|
7
|
+
deadlineAt: z.ZodOptional<z.ZodISODateTime>;
|
|
8
|
+
taskId: z.ZodString;
|
|
9
|
+
runContext: z.ZodObject<{
|
|
10
|
+
currentDateTime: z.ZodISODateTime;
|
|
11
|
+
intervalMs: z.ZodNumber;
|
|
12
|
+
continuationMode: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
operator: "operator";
|
|
14
|
+
agent: "agent";
|
|
15
|
+
}>>;
|
|
16
|
+
nextRunAt: z.ZodOptional<z.ZodISODateTime>;
|
|
17
|
+
previousRunAt: z.ZodOptional<z.ZodISODateTime>;
|
|
18
|
+
previousRunId: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$strict>;
|
|
20
|
+
task: z.ZodString;
|
|
21
|
+
checkpoint: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
|
|
22
|
+
model: z.ZodOptional<z.ZodString>;
|
|
23
|
+
reasoningEffort: z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
none: "none";
|
|
25
|
+
low: "low";
|
|
26
|
+
medium: "medium";
|
|
27
|
+
high: "high";
|
|
28
|
+
ultrahigh: "ultrahigh";
|
|
29
|
+
max: "max";
|
|
30
|
+
}>>;
|
|
31
|
+
maxSteps: z.ZodOptional<z.ZodNumber>;
|
|
32
|
+
searchIgnoreDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
33
|
+
systemContext: z.ZodOptional<z.ZodString>;
|
|
34
|
+
scope: z.ZodObject<{
|
|
35
|
+
tenantId: z.ZodString;
|
|
36
|
+
subjectId: z.ZodString;
|
|
37
|
+
productSessionId: z.ZodString;
|
|
38
|
+
}, z.core.$strict>;
|
|
39
|
+
runtimeSessionId: z.ZodString;
|
|
40
|
+
signal: z.ZodOptional<z.ZodCustom<AbortSignal, AbortSignal>>;
|
|
41
|
+
publishActivity: z.ZodOptional<z.ZodCustom<(activity: unknown) => void, (activity: unknown) => void>>;
|
|
42
|
+
}, z.core.$strict>;
|
|
43
|
+
export type HostedHeartbeatTaskInput = z.infer<typeof HostedHeartbeatTaskInputSchema>;
|
|
44
|
+
export interface HostedHeartbeatTaskRunner {
|
|
45
|
+
execute(input: HostedHeartbeatTaskInput): Promise<unknown>;
|
|
46
|
+
}
|
|
47
|
+
export type HostedHeartbeatTaskServiceConfig = {
|
|
48
|
+
authority: ExecutionAuthority;
|
|
49
|
+
executionHost: HeartbeatExecutionHost;
|
|
50
|
+
modelCredentials: HostedModelCredentialProvider;
|
|
51
|
+
/** Omit this policy when the heartbeat workflow needs no product MCP tools. */
|
|
52
|
+
mcp?: {
|
|
53
|
+
allowedTools: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export declare const HostedHeartbeatInvocationContextSchema: z.ZodObject<{
|
|
57
|
+
scope: z.ZodObject<{
|
|
58
|
+
tenantId: z.ZodString;
|
|
59
|
+
subjectId: z.ZodString;
|
|
60
|
+
productSessionId: z.ZodString;
|
|
61
|
+
}, z.core.$strict>;
|
|
62
|
+
runtimeSessionId: z.ZodString;
|
|
63
|
+
deadlineAt: z.ZodOptional<z.ZodISODateTime>;
|
|
64
|
+
}, z.core.$strict>;
|
|
65
|
+
export type HostedHeartbeatInvocationContext = z.infer<typeof HostedHeartbeatInvocationContextSchema>;
|
|
66
|
+
export type HostedHeartbeatAgentExecutionRequest = Omit<HostedHeartbeatTaskInput, 'scope' | 'runtimeSessionId' | 'invocationId' | 'deadlineAt' | 'signal' | 'publishActivity' | 'checkpoint'> & {
|
|
67
|
+
executionId: string;
|
|
68
|
+
checkpoint?: unknown;
|
|
69
|
+
};
|
|
70
|
+
export type HostedHeartbeatAgentExecutionTransportInput = {
|
|
71
|
+
request: HostedHeartbeatAgentExecutionRequest;
|
|
72
|
+
signal: AbortSignal;
|
|
73
|
+
publishActivity: (activity: unknown) => void;
|
|
74
|
+
};
|
|
75
|
+
export type HostedHeartbeatAgentExecutionTransportConfig = {
|
|
76
|
+
runner: HostedHeartbeatTaskRunner;
|
|
77
|
+
resolveInvocationContext(input: {
|
|
78
|
+
taskId: string;
|
|
79
|
+
executionId: string;
|
|
80
|
+
signal: AbortSignal;
|
|
81
|
+
}): HostedHeartbeatInvocationContext | Promise<HostedHeartbeatInvocationContext>;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/heartbeat/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAMhE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAWF,OAAO,KAAK,IAAI,aAAhB,OAAO,KAAK,IAAI;kBAI5C,CAAC;AAEd,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC5C,OAAO,8BAA8B,CACtC,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5D;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,aAAa,EAAE,sBAAsB,CAAC;IACtC,gBAAgB,EAAE,6BAA6B,CAAC;IAChD,+EAA+E;IAC/E,GAAG,CAAC,EAAE;QACJ,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;KACjC,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,sCAAsC;;;;;;;;kBAIxC,CAAC;AAEZ,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CACpD,OAAO,sCAAsC,CAC9C,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG,IAAI,CACrD,wBAAwB,EACtB,OAAO,GACP,kBAAkB,GAClB,cAAc,GACd,YAAY,GACZ,QAAQ,GACR,iBAAiB,GACjB,YAAY,CACf,GAAG;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,2CAA2C,GAAG;IACxD,OAAO,EAAE,oCAAoC,CAAC;IAC9C,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG;IACzD,MAAM,EAAE,yBAAyB,CAAC;IAClC,wBAAwB,CAAC,KAAK,EAAE;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,WAAW,CAAC;KACrB,GAAG,gCAAgC,GAChC,OAAO,CAAC,gCAAgC,CAAC,CAAC;CAC/C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ExecutionHostHeartbeatTaskRequestSchema, ExecutionScopeSchema, RuntimeSessionIdSchema, } from '../contracts/index.js';
|
|
3
|
+
export const HostedHeartbeatTaskInputSchema = ExecutionHostHeartbeatTaskRequestSchema.omit({
|
|
4
|
+
schemaVersion: true,
|
|
5
|
+
kind: true,
|
|
6
|
+
}).extend({
|
|
7
|
+
scope: ExecutionScopeSchema.omit({ adopterId: true }),
|
|
8
|
+
runtimeSessionId: RuntimeSessionIdSchema,
|
|
9
|
+
signal: z.custom((value) => value instanceof AbortSignal, 'signal must be an AbortSignal').optional(),
|
|
10
|
+
publishActivity: z.custom((value) => typeof value === 'function', 'publishActivity must be a function').optional(),
|
|
11
|
+
}).strict();
|
|
12
|
+
export const HostedHeartbeatInvocationContextSchema = z.object({
|
|
13
|
+
scope: ExecutionScopeSchema.omit({ adopterId: true }),
|
|
14
|
+
runtimeSessionId: RuntimeSessionIdSchema,
|
|
15
|
+
deadlineAt: ExecutionHostHeartbeatTaskRequestSchema.shape.deadlineAt,
|
|
16
|
+
}).strict();
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/heartbeat/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,uCAAuC,EACvC,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,CAAC,MAAM,8BAA8B,GACzC,uCAAuC,CAAC,IAAI,CAAC;IAC3C,aAAa,EAAE,IAAI;IACnB,IAAI,EAAE,IAAI;CACX,CAAC,CAAC,MAAM,CAAC;IACR,KAAK,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,gBAAgB,EAAE,sBAAsB;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,CACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,WAAW,EACvC,+BAA+B,CAChC,CAAC,QAAQ,EAAE;IACZ,eAAe,EAAE,CAAC,CAAC,MAAM,CACvB,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,UAAU,EACtC,oCAAoC,CACrC,CAAC,QAAQ,EAAE;CACb,CAAC,CAAC,MAAM,EAAE,CAAC;AAoBd,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7D,KAAK,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,gBAAgB,EAAE,sBAAsB;IACxC,UAAU,EAAE,uCAAuC,CAAC,KAAK,CAAC,UAAU;CACrE,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { z } from 'zod';\nimport type { ExecutionAuthority } from '../authority/index.js';\nimport {\n ExecutionHostHeartbeatTaskRequestSchema,\n ExecutionScopeSchema,\n RuntimeSessionIdSchema,\n} from '../contracts/index.js';\nimport type { HostedModelCredentialProvider } from '../conversation/index.js';\nimport type { HeartbeatExecutionHost } from '../http-sse/index.js';\n\nexport const HostedHeartbeatTaskInputSchema =\n ExecutionHostHeartbeatTaskRequestSchema.omit({\n schemaVersion: true,\n kind: true,\n }).extend({\n scope: ExecutionScopeSchema.omit({ adopterId: true }),\n runtimeSessionId: RuntimeSessionIdSchema,\n signal: z.custom<AbortSignal>(\n (value) => value instanceof AbortSignal,\n 'signal must be an AbortSignal',\n ).optional(),\n publishActivity: z.custom<(activity: unknown) => void>(\n (value) => typeof value === 'function',\n 'publishActivity must be a function',\n ).optional(),\n }).strict();\n\nexport type HostedHeartbeatTaskInput = z.infer<\n typeof HostedHeartbeatTaskInputSchema\n>;\n\nexport interface HostedHeartbeatTaskRunner {\n execute(input: HostedHeartbeatTaskInput): Promise<unknown>;\n}\n\nexport type HostedHeartbeatTaskServiceConfig = {\n authority: ExecutionAuthority;\n executionHost: HeartbeatExecutionHost;\n modelCredentials: HostedModelCredentialProvider;\n /** Omit this policy when the heartbeat workflow needs no product MCP tools. */\n mcp?: {\n allowedTools: readonly string[];\n };\n};\n\nexport const HostedHeartbeatInvocationContextSchema = z.object({\n scope: ExecutionScopeSchema.omit({ adopterId: true }),\n runtimeSessionId: RuntimeSessionIdSchema,\n deadlineAt: ExecutionHostHeartbeatTaskRequestSchema.shape.deadlineAt,\n}).strict();\n\nexport type HostedHeartbeatInvocationContext = z.infer<\n typeof HostedHeartbeatInvocationContextSchema\n>;\n\nexport type HostedHeartbeatAgentExecutionRequest = Omit<\n HostedHeartbeatTaskInput,\n | 'scope'\n | 'runtimeSessionId'\n | 'invocationId'\n | 'deadlineAt'\n | 'signal'\n | 'publishActivity'\n | 'checkpoint'\n> & {\n executionId: string;\n checkpoint?: unknown;\n};\n\nexport type HostedHeartbeatAgentExecutionTransportInput = {\n request: HostedHeartbeatAgentExecutionRequest;\n signal: AbortSignal;\n publishActivity: (activity: unknown) => void;\n};\n\nexport type HostedHeartbeatAgentExecutionTransportConfig = {\n runner: HostedHeartbeatTaskRunner;\n resolveInvocationContext(input: {\n taskId: string;\n executionId: string;\n signal: AbortSignal;\n }): HostedHeartbeatInvocationContext\n | Promise<HostedHeartbeatInvocationContext>;\n};\n"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { type ExecutionHostStreamEvent } from '../contracts/index.js';
|
|
2
|
-
import type { DirectHttpExecutionHostConfig, ExecutionHost, ExecutionHostConversationTurn } from './types.js';
|
|
1
|
+
import { type ExecutionHostHeartbeatStreamEvent, type ExecutionHostStreamEvent } from '../contracts/index.js';
|
|
2
|
+
import type { DirectHttpExecutionHostConfig, ExecutionHost, ExecutionHostConversationTurn, ExecutionHostHeartbeatTask, HeartbeatExecutionHost } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Strict direct-development HTTP/SSE adapter for the Execution Host v1 wire.
|
|
5
5
|
* It deliberately owns neither AWS SDK nor SigV4 behavior.
|
|
6
6
|
*/
|
|
7
|
-
export declare class DirectHttpExecutionHost implements ExecutionHost {
|
|
7
|
+
export declare class DirectHttpExecutionHost implements ExecutionHost, HeartbeatExecutionHost {
|
|
8
8
|
#private;
|
|
9
9
|
constructor(config: DirectHttpExecutionHostConfig);
|
|
10
10
|
streamConversationTurn(rawInput: ExecutionHostConversationTurn): AsyncIterable<ExecutionHostStreamEvent>;
|
|
11
|
+
streamHeartbeatTask(rawInput: ExecutionHostHeartbeatTask): AsyncIterable<ExecutionHostHeartbeatStreamEvent>;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=direct-http-execution-host.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AAEA,OAAO,EAmBL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAkCpB;;;GAGG;AACH,qBAAa,uBACb,YAAW,aAAa,EAAE,sBAAsB;;gBAKlC,MAAM,EAAE,6BAA6B;IAO1C,sBAAsB,CAC3B,QAAQ,EAAE,6BAA6B,GACtC,aAAa,CAAC,wBAAwB,CAAC;IAoBnC,mBAAmB,CACxB,QAAQ,EAAE,0BAA0B,GACnC,aAAa,CAAC,iCAAiC,CAAC;CAwJpD"}
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import { createParser } from 'eventsource-parser';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { AGENTCORE_RUNTIME_SESSION_HEADER, CONVERSATION_TURN_WORKFLOW, EXECUTION_ASSERTION_HEADER, EXECUTION_CONTRACT_VERSION, EXECUTION_HOST_LOCAL_TOKEN_HEADER, ExecutionHostConversationTurnRequestSchema, ExecutionHostStreamEventSchema, MCP_CAPABILITY_HEADER, MODEL_API_KEY_HEADER, OpaqueIdSchema, RuntimeSessionIdSchema, TimestampSchema, isExecutionHostTerminalEvent, isSafeWebUrl, } from '../contracts/index.js';
|
|
3
|
+
import { AGENTCORE_RUNTIME_SESSION_HEADER, CONVERSATION_TURN_WORKFLOW, EXECUTION_ASSERTION_HEADER, EXECUTION_CONTRACT_VERSION, EXECUTION_HOST_LOCAL_TOKEN_HEADER, ExecutionHostConversationTurnRequestSchema, ExecutionHostHeartbeatStreamEventSchema, ExecutionHostHeartbeatTaskRequestSchema, ExecutionHostStreamEventSchema, HEARTBEAT_TASK_WORKFLOW, MCP_CAPABILITY_HEADER, MODEL_API_KEY_HEADER, OpaqueIdSchema, RuntimeSessionIdSchema, TimestampSchema, isExecutionHostHeartbeatTerminalEvent, isExecutionHostTerminalEvent, isSafeWebUrl, } from '../contracts/index.js';
|
|
4
4
|
import { ExecutionHostInvocationCancelledError, ExecutionHostProtocolError, ExecutionHostRejectedError, ExecutionHostStreamInterruptedError, } from './errors.js';
|
|
5
5
|
const MAX_SSE_BUFFER_CHARACTERS = 1_048_576;
|
|
6
6
|
const MAX_PENDING_SSE_FRAMES = 1_024;
|
|
7
7
|
const MAX_ERROR_BODY_BYTES = 16_384;
|
|
8
8
|
const SecretSchema = z.string().min(8).max(4_096);
|
|
9
|
-
const
|
|
10
|
-
invocationId: OpaqueIdSchema,
|
|
9
|
+
const InvocationAuthoritySchema = z.object({
|
|
11
10
|
runtimeSessionId: RuntimeSessionIdSchema,
|
|
12
|
-
prompt: z.string().trim().min(1).max(200_000),
|
|
13
|
-
deadlineAt: TimestampSchema.optional(),
|
|
14
11
|
executionAssertion: z.string().min(32).max(4_096),
|
|
15
12
|
mcpCapability: z.string().min(32).max(4_096).optional(),
|
|
16
13
|
modelApiKey: SecretSchema,
|
|
17
14
|
signal: z.custom((value) => value instanceof AbortSignal, 'signal must be an AbortSignal').optional(),
|
|
18
15
|
}).strict();
|
|
16
|
+
const ConversationTurnSchema = InvocationAuthoritySchema.extend({
|
|
17
|
+
invocationId: OpaqueIdSchema,
|
|
18
|
+
prompt: z.string().trim().min(1).max(200_000),
|
|
19
|
+
deadlineAt: TimestampSchema.optional(),
|
|
20
|
+
}).strict();
|
|
21
|
+
const HeartbeatTaskSchema = InvocationAuthoritySchema.extend(ExecutionHostHeartbeatTaskRequestSchema.omit({
|
|
22
|
+
schemaVersion: true,
|
|
23
|
+
kind: true,
|
|
24
|
+
}).shape).strict();
|
|
19
25
|
const ApiErrorSchema = z.object({
|
|
20
26
|
error: z.object({
|
|
21
27
|
code: z.string().min(1).max(128).regex(/^[a-z0-9_]+$/),
|
|
@@ -41,7 +47,43 @@ export class DirectHttpExecutionHost {
|
|
|
41
47
|
if (input.signal?.aborted) {
|
|
42
48
|
throw new ExecutionHostInvocationCancelledError();
|
|
43
49
|
}
|
|
44
|
-
const
|
|
50
|
+
const body = ExecutionHostConversationTurnRequestSchema.parse({
|
|
51
|
+
schemaVersion: EXECUTION_CONTRACT_VERSION,
|
|
52
|
+
kind: CONVERSATION_TURN_WORKFLOW,
|
|
53
|
+
invocationId: input.invocationId,
|
|
54
|
+
prompt: input.prompt,
|
|
55
|
+
...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),
|
|
56
|
+
});
|
|
57
|
+
yield* this.#streamInvocation(input, body, ExecutionHostStreamEventSchema, isExecutionHostTerminalEvent);
|
|
58
|
+
}
|
|
59
|
+
async *streamHeartbeatTask(rawInput) {
|
|
60
|
+
const input = HeartbeatTaskSchema.parse(rawInput);
|
|
61
|
+
if (input.signal?.aborted) {
|
|
62
|
+
throw new ExecutionHostInvocationCancelledError();
|
|
63
|
+
}
|
|
64
|
+
const body = ExecutionHostHeartbeatTaskRequestSchema.parse({
|
|
65
|
+
schemaVersion: EXECUTION_CONTRACT_VERSION,
|
|
66
|
+
kind: HEARTBEAT_TASK_WORKFLOW,
|
|
67
|
+
invocationId: input.invocationId,
|
|
68
|
+
taskId: input.taskId,
|
|
69
|
+
task: input.task,
|
|
70
|
+
...(input.checkpoint ? { checkpoint: input.checkpoint } : {}),
|
|
71
|
+
runContext: input.runContext,
|
|
72
|
+
...(input.model ? { model: input.model } : {}),
|
|
73
|
+
...(input.reasoningEffort
|
|
74
|
+
? { reasoningEffort: input.reasoningEffort }
|
|
75
|
+
: {}),
|
|
76
|
+
...(input.maxSteps !== undefined ? { maxSteps: input.maxSteps } : {}),
|
|
77
|
+
...(input.searchIgnoreDirs
|
|
78
|
+
? { searchIgnoreDirs: input.searchIgnoreDirs }
|
|
79
|
+
: {}),
|
|
80
|
+
...(input.systemContext ? { systemContext: input.systemContext } : {}),
|
|
81
|
+
...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),
|
|
82
|
+
});
|
|
83
|
+
yield* this.#streamInvocation(input, body, ExecutionHostHeartbeatStreamEventSchema, isExecutionHostHeartbeatTerminalEvent);
|
|
84
|
+
}
|
|
85
|
+
async *#streamInvocation(input, body, schema, isTerminal) {
|
|
86
|
+
const response = await this.#invoke(input, body);
|
|
45
87
|
if (!response.ok) {
|
|
46
88
|
throw new ExecutionHostRejectedError(response.status, await readSafeErrorCode(response));
|
|
47
89
|
}
|
|
@@ -82,8 +124,8 @@ export class DirectHttpExecutionHost {
|
|
|
82
124
|
throw new ExecutionHostProtocolError();
|
|
83
125
|
}
|
|
84
126
|
while (pending.length > 0) {
|
|
85
|
-
const event = validateEvent(pending.shift(), state);
|
|
86
|
-
if (
|
|
127
|
+
const event = validateEvent(pending.shift(), state, schema, isTerminal);
|
|
128
|
+
if (isTerminal(event)) {
|
|
87
129
|
terminalEvent = event;
|
|
88
130
|
}
|
|
89
131
|
else {
|
|
@@ -97,8 +139,8 @@ export class DirectHttpExecutionHost {
|
|
|
97
139
|
throw new ExecutionHostProtocolError();
|
|
98
140
|
}
|
|
99
141
|
while (pending.length > 0) {
|
|
100
|
-
const event = validateEvent(pending.shift(), state);
|
|
101
|
-
if (
|
|
142
|
+
const event = validateEvent(pending.shift(), state, schema, isTerminal);
|
|
143
|
+
if (isTerminal(event)) {
|
|
102
144
|
terminalEvent = event;
|
|
103
145
|
}
|
|
104
146
|
else {
|
|
@@ -122,14 +164,7 @@ export class DirectHttpExecutionHost {
|
|
|
122
164
|
// post-terminal frame cannot be projected as success.
|
|
123
165
|
yield terminalEvent;
|
|
124
166
|
}
|
|
125
|
-
async #invoke(input) {
|
|
126
|
-
const body = ExecutionHostConversationTurnRequestSchema.parse({
|
|
127
|
-
schemaVersion: EXECUTION_CONTRACT_VERSION,
|
|
128
|
-
kind: CONVERSATION_TURN_WORKFLOW,
|
|
129
|
-
invocationId: input.invocationId,
|
|
130
|
-
prompt: input.prompt,
|
|
131
|
-
...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),
|
|
132
|
-
});
|
|
167
|
+
async #invoke(input, body) {
|
|
133
168
|
try {
|
|
134
169
|
return await this.#fetch(this.#endpoint, {
|
|
135
170
|
method: 'POST',
|
|
@@ -144,7 +179,7 @@ export class DirectHttpExecutionHost {
|
|
|
144
179
|
}
|
|
145
180
|
}
|
|
146
181
|
}
|
|
147
|
-
function validateEvent(frame, state) {
|
|
182
|
+
function validateEvent(frame, state, schema, isTerminal) {
|
|
148
183
|
let decoded;
|
|
149
184
|
try {
|
|
150
185
|
decoded = JSON.parse(frame.data);
|
|
@@ -152,7 +187,7 @@ function validateEvent(frame, state) {
|
|
|
152
187
|
catch {
|
|
153
188
|
throw new ExecutionHostProtocolError();
|
|
154
189
|
}
|
|
155
|
-
const parsed =
|
|
190
|
+
const parsed = schema.safeParse(decoded);
|
|
156
191
|
if (!parsed.success) {
|
|
157
192
|
throw new ExecutionHostProtocolError();
|
|
158
193
|
}
|
|
@@ -175,7 +210,7 @@ function validateEvent(frame, state) {
|
|
|
175
210
|
throw new ExecutionHostProtocolError();
|
|
176
211
|
}
|
|
177
212
|
state.nextSequence += 1;
|
|
178
|
-
state.terminal =
|
|
213
|
+
state.terminal = isTerminal(event);
|
|
179
214
|
return event;
|
|
180
215
|
}
|
|
181
216
|
function createSensitiveHeaders(input, localToken) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-http-execution-host.js","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { z } from 'zod';\nimport {\n AGENTCORE_RUNTIME_SESSION_HEADER,\n CONVERSATION_TURN_WORKFLOW,\n EXECUTION_ASSERTION_HEADER,\n EXECUTION_CONTRACT_VERSION,\n EXECUTION_HOST_LOCAL_TOKEN_HEADER,\n ExecutionHostConversationTurnRequestSchema,\n ExecutionHostStreamEventSchema,\n MCP_CAPABILITY_HEADER,\n MODEL_API_KEY_HEADER,\n OpaqueIdSchema,\n RuntimeSessionIdSchema,\n TimestampSchema,\n isExecutionHostTerminalEvent,\n isSafeWebUrl,\n type ExecutionHostStreamEvent,\n} from '../contracts/index.js';\nimport {\n ExecutionHostInvocationCancelledError,\n ExecutionHostProtocolError,\n ExecutionHostRejectedError,\n ExecutionHostStreamInterruptedError,\n} from './errors.js';\nimport type {\n DirectHttpExecutionHostConfig,\n ExecutionHost,\n ExecutionHostConversationTurn,\n} from './types.js';\n\nconst MAX_SSE_BUFFER_CHARACTERS = 1_048_576;\nconst MAX_PENDING_SSE_FRAMES = 1_024;\nconst MAX_ERROR_BODY_BYTES = 16_384;\nconst SecretSchema = z.string().min(8).max(4_096);\nconst ConversationTurnSchema = z.object({\n invocationId: OpaqueIdSchema,\n runtimeSessionId: RuntimeSessionIdSchema,\n prompt: z.string().trim().min(1).max(200_000),\n deadlineAt: TimestampSchema.optional(),\n executionAssertion: z.string().min(32).max(4_096),\n mcpCapability: z.string().min(32).max(4_096).optional(),\n modelApiKey: SecretSchema,\n signal: z.custom<AbortSignal>(\n (value) => value instanceof AbortSignal,\n 'signal must be an AbortSignal',\n ).optional(),\n}).strict();\nconst ApiErrorSchema = z.object({\n error: z.object({\n code: z.string().min(1).max(128).regex(/^[a-z0-9_]+$/),\n message: z.string(),\n }).strict(),\n}).strict();\n\n/**\n * Strict direct-development HTTP/SSE adapter for the Execution Host v1 wire.\n * It deliberately owns neither AWS SDK nor SigV4 behavior.\n */\nexport class DirectHttpExecutionHost implements ExecutionHost {\n readonly #endpoint: URL;\n readonly #fetch: typeof fetch;\n readonly #localToken: string;\n\n constructor(config: DirectHttpExecutionHostConfig) {\n assertSafeBaseUrl(config.baseUrl);\n this.#localToken = SecretSchema.parse(config.localToken);\n this.#endpoint = new URL('invocations', withTrailingSlash(config.baseUrl));\n this.#fetch = config.fetch ?? globalThis.fetch;\n }\n\n async *streamConversationTurn(\n rawInput: ExecutionHostConversationTurn,\n ): AsyncIterable<ExecutionHostStreamEvent> {\n const input = ConversationTurnSchema.parse(rawInput);\n if (input.signal?.aborted) {\n throw new ExecutionHostInvocationCancelledError();\n }\n\n const response = await this.#invoke(input);\n if (!response.ok) {\n throw new ExecutionHostRejectedError(\n response.status,\n await readSafeErrorCode(response),\n );\n }\n if (!isEventStream(response.headers.get('content-type'))) {\n await cancelBody(response);\n throw new ExecutionHostProtocolError(\n 'Execution Host did not return an SSE stream.',\n );\n }\n if (!response.body) {\n throw new ExecutionHostProtocolError(\n 'Execution Host returned an empty SSE response body.',\n );\n }\n\n const state: StreamValidationState = {\n invocationId: input.invocationId,\n nextSequence: 0,\n terminal: false,\n };\n const decoder = new TextDecoder();\n const pending: EventSourceMessage[] = [];\n let terminalEvent: ExecutionHostStreamEvent | undefined;\n let parserError = false;\n const parser = createParser({\n maxBufferSize: MAX_SSE_BUFFER_CHARACTERS,\n onEvent: (event) => {\n if (pending.length >= MAX_PENDING_SSE_FRAMES) {\n parserError = true;\n return;\n }\n pending.push(event);\n },\n onError: () => {\n parserError = true;\n },\n });\n\n try {\n for await (const chunk of response.body) {\n input.signal?.throwIfAborted();\n parser.feed(decoder.decode(chunk, { stream: true }));\n if (parserError) {\n throw new ExecutionHostProtocolError();\n }\n while (pending.length > 0) {\n const event = validateEvent(pending.shift()!, state);\n if (isExecutionHostTerminalEvent(event)) {\n terminalEvent = event;\n } else {\n yield event;\n }\n }\n }\n parser.feed(decoder.decode());\n parser.reset({ consume: true });\n if (parserError) {\n throw new ExecutionHostProtocolError();\n }\n while (pending.length > 0) {\n const event = validateEvent(pending.shift()!, state);\n if (isExecutionHostTerminalEvent(event)) {\n terminalEvent = event;\n } else {\n yield event;\n }\n }\n } catch (error) {\n if (error instanceof ExecutionHostProtocolError) {\n throw error;\n }\n throw toTransportError(error, input.signal);\n }\n\n if (!state.accepted) {\n throw new ExecutionHostProtocolError(\n 'Execution Host stream omitted the accepted event.',\n );\n }\n if (!state.terminal || !terminalEvent) {\n throw new ExecutionHostStreamInterruptedError();\n }\n // Terminal is released only after clean EOF, so a trailing malformed or\n // post-terminal frame cannot be projected as success.\n yield terminalEvent;\n }\n\n async #invoke(\n input: z.infer<typeof ConversationTurnSchema>,\n ): Promise<Response> {\n const body = ExecutionHostConversationTurnRequestSchema.parse({\n schemaVersion: EXECUTION_CONTRACT_VERSION,\n kind: CONVERSATION_TURN_WORKFLOW,\n invocationId: input.invocationId,\n prompt: input.prompt,\n ...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),\n });\n try {\n return await this.#fetch(this.#endpoint, {\n method: 'POST',\n redirect: 'error',\n signal: input.signal,\n headers: createSensitiveHeaders(input, this.#localToken),\n body: JSON.stringify(body),\n });\n } catch (error) {\n throw toTransportError(error, input.signal);\n }\n }\n}\n\ntype StreamValidationState = {\n invocationId: string;\n runId?: string;\n nextSequence: number;\n accepted?: true;\n terminal: boolean;\n};\n\nfunction validateEvent(\n frame: EventSourceMessage,\n state: StreamValidationState,\n): ExecutionHostStreamEvent {\n let decoded: unknown;\n try {\n decoded = JSON.parse(frame.data);\n } catch {\n throw new ExecutionHostProtocolError();\n }\n const parsed = ExecutionHostStreamEventSchema.safeParse(decoded);\n if (!parsed.success) {\n throw new ExecutionHostProtocolError();\n }\n const event = parsed.data;\n const correctFrameMetadata = frame.event === event.kind\n && frame.id === String(event.sequence);\n const correctEnvelope = event.invocationId === state.invocationId\n && event.sequence === state.nextSequence;\n if (!correctFrameMetadata || !correctEnvelope || state.terminal) {\n throw new ExecutionHostProtocolError();\n }\n\n if (!state.accepted) {\n if (event.kind !== 'accepted') {\n throw new ExecutionHostProtocolError();\n }\n state.accepted = true;\n state.runId = event.runId;\n } else if (event.kind === 'accepted' || event.runId !== state.runId) {\n throw new ExecutionHostProtocolError();\n }\n\n state.nextSequence += 1;\n state.terminal = isExecutionHostTerminalEvent(event);\n return event;\n}\n\nfunction createSensitiveHeaders(\n input: z.infer<typeof ConversationTurnSchema>,\n localToken: string,\n): Headers {\n const headers = new Headers({\n Accept: 'text/event-stream',\n 'Content-Type': 'application/json',\n [AGENTCORE_RUNTIME_SESSION_HEADER]: input.runtimeSessionId,\n [EXECUTION_HOST_LOCAL_TOKEN_HEADER]: localToken,\n [MODEL_API_KEY_HEADER]: input.modelApiKey,\n [EXECUTION_ASSERTION_HEADER]: input.executionAssertion,\n });\n if (input.mcpCapability) {\n headers.set(MCP_CAPABILITY_HEADER, input.mcpCapability);\n }\n return headers;\n}\n\nfunction isEventStream(contentType: string | null): boolean {\n return contentType?.split(';', 1)[0]?.trim().toLowerCase()\n === 'text/event-stream';\n}\n\nasync function readSafeErrorCode(response: Response): Promise<string> {\n try {\n const declaredLength = Number(response.headers.get('content-length'));\n if (\n Number.isFinite(declaredLength)\n && declaredLength > MAX_ERROR_BODY_BYTES\n ) {\n await cancelBody(response);\n return 'unknown';\n }\n const bytes = await readBoundedBody(response, MAX_ERROR_BODY_BYTES);\n if (!bytes) {\n return 'unknown';\n }\n const parsed = ApiErrorSchema.safeParse(\n JSON.parse(new TextDecoder().decode(bytes)),\n );\n return parsed.success ? parsed.data.error.code : 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nasync function readBoundedBody(\n response: Response,\n maxBytes: number,\n): Promise<Uint8Array | undefined> {\n if (!response.body) {\n return new Uint8Array();\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n await reader.cancel();\n return undefined;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function cancelBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the protocol error.\n }\n}\n\nfunction toTransportError(error: unknown, signal?: AbortSignal): Error {\n if (signal?.aborted || isAbortError(error)) {\n return new ExecutionHostInvocationCancelledError();\n }\n return new ExecutionHostStreamInterruptedError();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction assertSafeBaseUrl(url: URL): void {\n if (!isSafeWebUrl(url)) {\n throw new Error(\n 'Direct Execution Host URL must use HTTPS or loopback HTTP and contain no credentials, query, or fragment.',\n );\n }\n}\n\nfunction withTrailingSlash(url: URL): URL {\n const normalized = new URL(url);\n normalized.pathname = normalized.pathname.endsWith('/')\n ? normalized.pathname\n : `${normalized.pathname}/`;\n return normalized;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"direct-http-execution-host.js","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport { z } from 'zod';\nimport {\n AGENTCORE_RUNTIME_SESSION_HEADER,\n CONVERSATION_TURN_WORKFLOW,\n EXECUTION_ASSERTION_HEADER,\n EXECUTION_CONTRACT_VERSION,\n EXECUTION_HOST_LOCAL_TOKEN_HEADER,\n ExecutionHostConversationTurnRequestSchema,\n ExecutionHostHeartbeatStreamEventSchema,\n ExecutionHostHeartbeatTaskRequestSchema,\n ExecutionHostStreamEventSchema,\n HEARTBEAT_TASK_WORKFLOW,\n MCP_CAPABILITY_HEADER,\n MODEL_API_KEY_HEADER,\n OpaqueIdSchema,\n RuntimeSessionIdSchema,\n TimestampSchema,\n isExecutionHostHeartbeatTerminalEvent,\n isExecutionHostTerminalEvent,\n isSafeWebUrl,\n type ExecutionHostHeartbeatStreamEvent,\n type ExecutionHostStreamEvent,\n} from '../contracts/index.js';\nimport {\n ExecutionHostInvocationCancelledError,\n ExecutionHostProtocolError,\n ExecutionHostRejectedError,\n ExecutionHostStreamInterruptedError,\n} from './errors.js';\nimport type {\n DirectHttpExecutionHostConfig,\n ExecutionHost,\n ExecutionHostConversationTurn,\n ExecutionHostHeartbeatTask,\n HeartbeatExecutionHost,\n} from './types.js';\n\nconst MAX_SSE_BUFFER_CHARACTERS = 1_048_576;\nconst MAX_PENDING_SSE_FRAMES = 1_024;\nconst MAX_ERROR_BODY_BYTES = 16_384;\nconst SecretSchema = z.string().min(8).max(4_096);\nconst InvocationAuthoritySchema = z.object({\n runtimeSessionId: RuntimeSessionIdSchema,\n executionAssertion: z.string().min(32).max(4_096),\n mcpCapability: z.string().min(32).max(4_096).optional(),\n modelApiKey: SecretSchema,\n signal: z.custom<AbortSignal>(\n (value) => value instanceof AbortSignal,\n 'signal must be an AbortSignal',\n ).optional(),\n}).strict();\nconst ConversationTurnSchema = InvocationAuthoritySchema.extend({\n invocationId: OpaqueIdSchema,\n prompt: z.string().trim().min(1).max(200_000),\n deadlineAt: TimestampSchema.optional(),\n}).strict();\nconst HeartbeatTaskSchema = InvocationAuthoritySchema.extend(\n ExecutionHostHeartbeatTaskRequestSchema.omit({\n schemaVersion: true,\n kind: true,\n }).shape,\n).strict();\nconst ApiErrorSchema = z.object({\n error: z.object({\n code: z.string().min(1).max(128).regex(/^[a-z0-9_]+$/),\n message: z.string(),\n }).strict(),\n}).strict();\n\n/**\n * Strict direct-development HTTP/SSE adapter for the Execution Host v1 wire.\n * It deliberately owns neither AWS SDK nor SigV4 behavior.\n */\nexport class DirectHttpExecutionHost\nimplements ExecutionHost, HeartbeatExecutionHost {\n readonly #endpoint: URL;\n readonly #fetch: typeof fetch;\n readonly #localToken: string;\n\n constructor(config: DirectHttpExecutionHostConfig) {\n assertSafeBaseUrl(config.baseUrl);\n this.#localToken = SecretSchema.parse(config.localToken);\n this.#endpoint = new URL('invocations', withTrailingSlash(config.baseUrl));\n this.#fetch = config.fetch ?? globalThis.fetch;\n }\n\n async *streamConversationTurn(\n rawInput: ExecutionHostConversationTurn,\n ): AsyncIterable<ExecutionHostStreamEvent> {\n const input = ConversationTurnSchema.parse(rawInput);\n if (input.signal?.aborted) {\n throw new ExecutionHostInvocationCancelledError();\n }\n const body = ExecutionHostConversationTurnRequestSchema.parse({\n schemaVersion: EXECUTION_CONTRACT_VERSION,\n kind: CONVERSATION_TURN_WORKFLOW,\n invocationId: input.invocationId,\n prompt: input.prompt,\n ...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),\n });\n yield* this.#streamInvocation(\n input,\n body,\n ExecutionHostStreamEventSchema,\n isExecutionHostTerminalEvent,\n );\n }\n\n async *streamHeartbeatTask(\n rawInput: ExecutionHostHeartbeatTask,\n ): AsyncIterable<ExecutionHostHeartbeatStreamEvent> {\n const input = HeartbeatTaskSchema.parse(rawInput);\n if (input.signal?.aborted) {\n throw new ExecutionHostInvocationCancelledError();\n }\n const body = ExecutionHostHeartbeatTaskRequestSchema.parse({\n schemaVersion: EXECUTION_CONTRACT_VERSION,\n kind: HEARTBEAT_TASK_WORKFLOW,\n invocationId: input.invocationId,\n taskId: input.taskId,\n task: input.task,\n ...(input.checkpoint ? { checkpoint: input.checkpoint } : {}),\n runContext: input.runContext,\n ...(input.model ? { model: input.model } : {}),\n ...(input.reasoningEffort\n ? { reasoningEffort: input.reasoningEffort }\n : {}),\n ...(input.maxSteps !== undefined ? { maxSteps: input.maxSteps } : {}),\n ...(input.searchIgnoreDirs\n ? { searchIgnoreDirs: input.searchIgnoreDirs }\n : {}),\n ...(input.systemContext ? { systemContext: input.systemContext } : {}),\n ...(input.deadlineAt ? { deadlineAt: input.deadlineAt } : {}),\n });\n yield* this.#streamInvocation(\n input,\n body,\n ExecutionHostHeartbeatStreamEventSchema,\n isExecutionHostHeartbeatTerminalEvent,\n );\n }\n\n async *#streamInvocation<TEvent extends ValidatedStreamEvent>(\n input: InvocationInput,\n body: unknown,\n schema: z.ZodType<TEvent>,\n isTerminal: (event: TEvent) => boolean,\n ): AsyncIterable<TEvent> {\n const response = await this.#invoke(input, body);\n if (!response.ok) {\n throw new ExecutionHostRejectedError(\n response.status,\n await readSafeErrorCode(response),\n );\n }\n if (!isEventStream(response.headers.get('content-type'))) {\n await cancelBody(response);\n throw new ExecutionHostProtocolError(\n 'Execution Host did not return an SSE stream.',\n );\n }\n if (!response.body) {\n throw new ExecutionHostProtocolError(\n 'Execution Host returned an empty SSE response body.',\n );\n }\n\n const state: StreamValidationState = {\n invocationId: input.invocationId,\n nextSequence: 0,\n terminal: false,\n };\n const decoder = new TextDecoder();\n const pending: EventSourceMessage[] = [];\n let terminalEvent: TEvent | undefined;\n let parserError = false;\n const parser = createParser({\n maxBufferSize: MAX_SSE_BUFFER_CHARACTERS,\n onEvent: (event) => {\n if (pending.length >= MAX_PENDING_SSE_FRAMES) {\n parserError = true;\n return;\n }\n pending.push(event);\n },\n onError: () => {\n parserError = true;\n },\n });\n\n try {\n for await (const chunk of response.body) {\n input.signal?.throwIfAborted();\n parser.feed(decoder.decode(chunk, { stream: true }));\n if (parserError) {\n throw new ExecutionHostProtocolError();\n }\n while (pending.length > 0) {\n const event = validateEvent(\n pending.shift()!,\n state,\n schema,\n isTerminal,\n );\n if (isTerminal(event)) {\n terminalEvent = event;\n } else {\n yield event;\n }\n }\n }\n parser.feed(decoder.decode());\n parser.reset({ consume: true });\n if (parserError) {\n throw new ExecutionHostProtocolError();\n }\n while (pending.length > 0) {\n const event = validateEvent(\n pending.shift()!,\n state,\n schema,\n isTerminal,\n );\n if (isTerminal(event)) {\n terminalEvent = event;\n } else {\n yield event;\n }\n }\n } catch (error) {\n if (error instanceof ExecutionHostProtocolError) {\n throw error;\n }\n throw toTransportError(error, input.signal);\n }\n\n if (!state.accepted) {\n throw new ExecutionHostProtocolError(\n 'Execution Host stream omitted the accepted event.',\n );\n }\n if (!state.terminal || !terminalEvent) {\n throw new ExecutionHostStreamInterruptedError();\n }\n // Terminal is released only after clean EOF, so a trailing malformed or\n // post-terminal frame cannot be projected as success.\n yield terminalEvent;\n }\n\n async #invoke(input: InvocationInput, body: unknown): Promise<Response> {\n try {\n return await this.#fetch(this.#endpoint, {\n method: 'POST',\n redirect: 'error',\n signal: input.signal,\n headers: createSensitiveHeaders(input, this.#localToken),\n body: JSON.stringify(body),\n });\n } catch (error) {\n throw toTransportError(error, input.signal);\n }\n }\n}\n\ntype StreamValidationState = {\n invocationId: string;\n runId?: string;\n nextSequence: number;\n accepted?: true;\n terminal: boolean;\n};\n\ntype InvocationInput = {\n invocationId: string;\n runtimeSessionId: string;\n executionAssertion: string;\n mcpCapability?: string;\n modelApiKey: string;\n signal?: AbortSignal;\n};\n\ntype ValidatedStreamEvent = {\n kind: string;\n invocationId: string;\n runId: string;\n sequence: number;\n timestamp: string;\n};\n\nfunction validateEvent<TEvent extends ValidatedStreamEvent>(\n frame: EventSourceMessage,\n state: StreamValidationState,\n schema: z.ZodType<TEvent>,\n isTerminal: (event: TEvent) => boolean,\n): TEvent {\n let decoded: unknown;\n try {\n decoded = JSON.parse(frame.data);\n } catch {\n throw new ExecutionHostProtocolError();\n }\n const parsed = schema.safeParse(decoded);\n if (!parsed.success) {\n throw new ExecutionHostProtocolError();\n }\n const event = parsed.data;\n const correctFrameMetadata = frame.event === event.kind\n && frame.id === String(event.sequence);\n const correctEnvelope = event.invocationId === state.invocationId\n && event.sequence === state.nextSequence;\n if (!correctFrameMetadata || !correctEnvelope || state.terminal) {\n throw new ExecutionHostProtocolError();\n }\n\n if (!state.accepted) {\n if (event.kind !== 'accepted') {\n throw new ExecutionHostProtocolError();\n }\n state.accepted = true;\n state.runId = event.runId;\n } else if (event.kind === 'accepted' || event.runId !== state.runId) {\n throw new ExecutionHostProtocolError();\n }\n\n state.nextSequence += 1;\n state.terminal = isTerminal(event);\n return event;\n}\n\nfunction createSensitiveHeaders(\n input: InvocationInput,\n localToken: string,\n): Headers {\n const headers = new Headers({\n Accept: 'text/event-stream',\n 'Content-Type': 'application/json',\n [AGENTCORE_RUNTIME_SESSION_HEADER]: input.runtimeSessionId,\n [EXECUTION_HOST_LOCAL_TOKEN_HEADER]: localToken,\n [MODEL_API_KEY_HEADER]: input.modelApiKey,\n [EXECUTION_ASSERTION_HEADER]: input.executionAssertion,\n });\n if (input.mcpCapability) {\n headers.set(MCP_CAPABILITY_HEADER, input.mcpCapability);\n }\n return headers;\n}\n\nfunction isEventStream(contentType: string | null): boolean {\n return contentType?.split(';', 1)[0]?.trim().toLowerCase()\n === 'text/event-stream';\n}\n\nasync function readSafeErrorCode(response: Response): Promise<string> {\n try {\n const declaredLength = Number(response.headers.get('content-length'));\n if (\n Number.isFinite(declaredLength)\n && declaredLength > MAX_ERROR_BODY_BYTES\n ) {\n await cancelBody(response);\n return 'unknown';\n }\n const bytes = await readBoundedBody(response, MAX_ERROR_BODY_BYTES);\n if (!bytes) {\n return 'unknown';\n }\n const parsed = ApiErrorSchema.safeParse(\n JSON.parse(new TextDecoder().decode(bytes)),\n );\n return parsed.success ? parsed.data.error.code : 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nasync function readBoundedBody(\n response: Response,\n maxBytes: number,\n): Promise<Uint8Array | undefined> {\n if (!response.body) {\n return new Uint8Array();\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n totalBytes += value.byteLength;\n if (totalBytes > maxBytes) {\n await reader.cancel();\n return undefined;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function cancelBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel();\n } catch {\n // Response cleanup is best effort and must not replace the protocol error.\n }\n}\n\nfunction toTransportError(error: unknown, signal?: AbortSignal): Error {\n if (signal?.aborted || isAbortError(error)) {\n return new ExecutionHostInvocationCancelledError();\n }\n return new ExecutionHostStreamInterruptedError();\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction assertSafeBaseUrl(url: URL): void {\n if (!isSafeWebUrl(url)) {\n throw new Error(\n 'Direct Execution Host URL must use HTTPS or loopback HTTP and contain no credentials, query, or fragment.',\n );\n }\n}\n\nfunction withTrailingSlash(url: URL): URL {\n const normalized = new URL(url);\n normalized.pathname = normalized.pathname.endsWith('/')\n ? normalized.pathname\n : `${normalized.pathname}/`;\n return normalized;\n}\n"]}
|
package/dist/http-sse/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { DirectHttpExecutionHost } from './direct-http-execution-host.js';
|
|
2
2
|
export { ExecutionHostInvocationCancelledError, ExecutionHostProtocolError, ExecutionHostRejectedError, ExecutionHostStreamInterruptedError, } from './errors.js';
|
|
3
|
-
export type { DirectHttpExecutionHostConfig, ExecutionHost, ExecutionHostConversationTurn, } from './types.js';
|
|
3
|
+
export type { DirectHttpExecutionHostConfig, ExecutionHost, ExecutionHostConversationTurn, ExecutionHostHeartbeatTask, HeartbeatExecutionHost, } from './types.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http-sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,qCAAqC,EACrC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,GACpC,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http-sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,qCAAqC,EACrC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,GACpC,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http-sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,qCAAqC,EACrC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,GACpC,MAAM,aAAa,CAAC","sourcesContent":["export { DirectHttpExecutionHost } from './direct-http-execution-host.js';\nexport {\n ExecutionHostInvocationCancelledError,\n ExecutionHostProtocolError,\n ExecutionHostRejectedError,\n ExecutionHostStreamInterruptedError,\n} from './errors.js';\nexport type {\n DirectHttpExecutionHostConfig,\n ExecutionHost,\n ExecutionHostConversationTurn,\n} from './types.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http-sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,qCAAqC,EACrC,0BAA0B,EAC1B,0BAA0B,EAC1B,mCAAmC,GACpC,MAAM,aAAa,CAAC","sourcesContent":["export { DirectHttpExecutionHost } from './direct-http-execution-host.js';\nexport {\n ExecutionHostInvocationCancelledError,\n ExecutionHostProtocolError,\n ExecutionHostRejectedError,\n ExecutionHostStreamInterruptedError,\n} from './errors.js';\nexport type {\n DirectHttpExecutionHostConfig,\n ExecutionHost,\n ExecutionHostConversationTurn,\n ExecutionHostHeartbeatTask,\n HeartbeatExecutionHost,\n} from './types.js';\n"]}
|
package/dist/http-sse/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExecutionHostStreamEvent } from '../contracts/index.js';
|
|
1
|
+
import type { ExecutionHostHeartbeatStreamEvent, ExecutionHostHeartbeatTaskRequest, ExecutionHostStreamEvent } from '../contracts/index.js';
|
|
2
2
|
export type ExecutionHostConversationTurn = {
|
|
3
3
|
invocationId: string;
|
|
4
4
|
runtimeSessionId: string;
|
|
@@ -12,6 +12,16 @@ export type ExecutionHostConversationTurn = {
|
|
|
12
12
|
export interface ExecutionHost {
|
|
13
13
|
streamConversationTurn(input: ExecutionHostConversationTurn): AsyncIterable<ExecutionHostStreamEvent>;
|
|
14
14
|
}
|
|
15
|
+
export type ExecutionHostHeartbeatTask = Omit<ExecutionHostHeartbeatTaskRequest, 'schemaVersion' | 'kind'> & {
|
|
16
|
+
runtimeSessionId: string;
|
|
17
|
+
executionAssertion: string;
|
|
18
|
+
mcpCapability?: string;
|
|
19
|
+
modelApiKey: string;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
};
|
|
22
|
+
export interface HeartbeatExecutionHost {
|
|
23
|
+
streamHeartbeatTask(input: ExecutionHostHeartbeatTask): AsyncIterable<ExecutionHostHeartbeatStreamEvent>;
|
|
24
|
+
}
|
|
15
25
|
export type DirectHttpExecutionHostConfig = {
|
|
16
26
|
baseUrl: URL;
|
|
17
27
|
localToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/http-sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/http-sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iCAAiC,EACjC,iCAAiC,EACjC,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,6BAA6B,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,sBAAsB,CACpB,KAAK,EAAE,6BAA6B,GACnC,aAAa,CAAC,wBAAwB,CAAC,CAAC;CAC5C;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,iCAAiC,EACjC,eAAe,GAAG,MAAM,CACzB,GAAG;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CACjB,KAAK,EAAE,0BAA0B,GAChC,aAAa,CAAC,iCAAiC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/http-sse/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/http-sse/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionHostHeartbeatStreamEvent,\n ExecutionHostHeartbeatTaskRequest,\n ExecutionHostStreamEvent,\n} from '../contracts/index.js';\n\nexport type ExecutionHostConversationTurn = {\n invocationId: string;\n runtimeSessionId: string;\n prompt: string;\n deadlineAt?: string;\n executionAssertion: string;\n mcpCapability?: string;\n modelApiKey: string;\n signal?: AbortSignal;\n};\n\nexport interface ExecutionHost {\n streamConversationTurn(\n input: ExecutionHostConversationTurn,\n ): AsyncIterable<ExecutionHostStreamEvent>;\n}\n\nexport type ExecutionHostHeartbeatTask = Omit<\n ExecutionHostHeartbeatTaskRequest,\n 'schemaVersion' | 'kind'\n> & {\n runtimeSessionId: string;\n executionAssertion: string;\n mcpCapability?: string;\n modelApiKey: string;\n signal?: AbortSignal;\n};\n\nexport interface HeartbeatExecutionHost {\n streamHeartbeatTask(\n input: ExecutionHostHeartbeatTask,\n ): AsyncIterable<ExecutionHostHeartbeatStreamEvent>;\n}\n\nexport type DirectHttpExecutionHostConfig = {\n baseUrl: URL;\n localToken: string;\n fetch?: typeof fetch;\n};\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './contracts/index.js';
|
|
2
2
|
export * from './authority/index.js';
|
|
3
3
|
export * from './conversation/index.js';
|
|
4
|
+
export * from './heartbeat/index.js';
|
|
4
5
|
export * from './mcp/index.js';
|
|
5
6
|
export * from './http-sse/index.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './contracts/index.js';
|
|
2
2
|
export * from './authority/index.js';
|
|
3
3
|
export * from './conversation/index.js';
|
|
4
|
+
export * from './heartbeat/index.js';
|
|
4
5
|
export * from './mcp/index.js';
|
|
5
6
|
export * from './http-sse/index.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './contracts/index.js';\nexport * from './authority/index.js';\nexport * from './conversation/index.js';\nexport * from './mcp/index.js';\nexport * from './http-sse/index.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC","sourcesContent":["export * from './contracts/index.js';\nexport * from './authority/index.js';\nexport * from './conversation/index.js';\nexport * from './heartbeat/index.js';\nexport * from './mcp/index.js';\nexport * from './http-sse/index.js';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heddleagent/execution-host-client",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "Backend contracts, execution authority, lifecycle services, and clients for compatible Heddle Execution Hosts",
|
|
5
5
|
"author": "Jay / Fienna Liang <roackb2@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"types": "./dist/conversation/index.d.ts",
|
|
43
43
|
"import": "./dist/conversation/index.js"
|
|
44
44
|
},
|
|
45
|
+
"./heartbeat": {
|
|
46
|
+
"types": "./dist/heartbeat/index.d.ts",
|
|
47
|
+
"import": "./dist/heartbeat/index.js"
|
|
48
|
+
},
|
|
45
49
|
"./mcp": {
|
|
46
50
|
"types": "./dist/mcp/index.d.ts",
|
|
47
51
|
"import": "./dist/mcp/index.js"
|
|
@@ -54,6 +58,10 @@
|
|
|
54
58
|
"types": "./dist/http-sse/index.d.ts",
|
|
55
59
|
"import": "./dist/http-sse/index.js"
|
|
56
60
|
},
|
|
61
|
+
"./agentcore": {
|
|
62
|
+
"types": "./dist/agentcore/index.d.ts",
|
|
63
|
+
"import": "./dist/agentcore/index.js"
|
|
64
|
+
},
|
|
57
65
|
"./testing": {
|
|
58
66
|
"types": "./dist/testing/index.d.ts",
|
|
59
67
|
"import": "./dist/testing/index.js"
|
|
@@ -83,7 +91,9 @@
|
|
|
83
91
|
"streaming"
|
|
84
92
|
],
|
|
85
93
|
"dependencies": {
|
|
94
|
+
"@aws-sdk/client-bedrock-agentcore": "^3.1107.0",
|
|
86
95
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
96
|
+
"@smithy/protocol-http": "^5.5.16",
|
|
87
97
|
"dayjs": "^1.11.20",
|
|
88
98
|
"eventsource-parser": "^3.1.0",
|
|
89
99
|
"jose": "^6.2.8",
|
package/spec/v1/README.md
CHANGED
|
@@ -13,7 +13,9 @@ JavaScript or TypeScript.
|
|
|
13
13
|
safe API errors, and the optional durable conversation-lifecycle profile.
|
|
14
14
|
- `fixtures/` contains executable examples for valid and invalid requests,
|
|
15
15
|
complete and interrupted streams, cancellation, sequence validation, and
|
|
16
|
-
execution/MCP authority.
|
|
16
|
+
execution/MCP authority. It includes distinct valid request/result examples
|
|
17
|
+
for `conversation-turn` and `heartbeat-task`.
|
|
18
|
+
`durable-conversation-lifecycle.json` supplies the
|
|
17
19
|
shared TypeScript/Python terminal and store-transition vectors.
|
|
18
20
|
- `durable-hosted-conversation-lifecycle.md` defines persistence ordering,
|
|
19
21
|
transition fencing, safe projection, interruption, and reconciliation for a
|
|
@@ -63,6 +65,11 @@ also enforce these relationships:
|
|
|
63
65
|
before each operation.
|
|
64
66
|
10. `allowedTools` is unique, contains at most 16 collision-free names, and the
|
|
65
67
|
aggregate tool-name length is at most 512 characters.
|
|
68
|
+
11. The request `kind`, execution assertion `workflow`, optional MCP capability
|
|
69
|
+
`workflow`, and selected event schema all name the same workflow.
|
|
70
|
+
12. A heartbeat terminal `result` remains JSON on the wire; the Heddle
|
|
71
|
+
scheduler validates the complete `AgentHeartbeatResult` before durable
|
|
72
|
+
checkpoint or success settlement.
|
|
66
73
|
|
|
67
74
|
The optional durable profile adds control-plane semantics around this stream.
|
|
68
75
|
It does not add a database endpoint to the Execution Host or make product
|
|
@@ -89,9 +96,12 @@ not adopter-domain contracts.
|
|
|
89
96
|
|
|
90
97
|
## Compatibility and stop line
|
|
91
98
|
|
|
92
|
-
Version 1 supports `conversation-turn
|
|
93
|
-
|
|
94
|
-
|
|
99
|
+
Version 1 supports the explicit `conversation-turn` and `heartbeat-task`
|
|
100
|
+
profiles. The heartbeat profile is additive: existing conversation requests and
|
|
101
|
+
events are unchanged, while implementations opt into the new discriminator and
|
|
102
|
+
schemas. Any further workflow, transport, incompatible field, or identity form
|
|
103
|
+
requires another explicit contract-version decision; it is not silently added
|
|
104
|
+
to this surface.
|
|
95
105
|
|
|
96
106
|
The repository deliberately stops after this schema, fixture set, the
|
|
97
107
|
TypeScript implementation, and one Python clean-room reference pass. It does
|