@heddleagent/execution-host-client 6.1.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.
Files changed (54) hide show
  1. package/README.md +42 -3
  2. package/dist/agentcore/agentcore-execution-host.d.ts +4 -3
  3. package/dist/agentcore/agentcore-execution-host.d.ts.map +1 -1
  4. package/dist/agentcore/agentcore-execution-host.js +4 -0
  5. package/dist/agentcore/agentcore-execution-host.js.map +1 -1
  6. package/dist/authority/jose-execution-authority.js +2 -2
  7. package/dist/authority/jose-execution-authority.js.map +1 -1
  8. package/dist/contracts/index.d.ts +106 -3
  9. package/dist/contracts/index.d.ts.map +1 -1
  10. package/dist/contracts/index.js +67 -2
  11. package/dist/contracts/index.js.map +1 -1
  12. package/dist/conversation/index.d.ts +1 -1
  13. package/dist/conversation/index.d.ts.map +1 -1
  14. package/dist/conversation/index.js.map +1 -1
  15. package/dist/conversation/types.d.ts +4 -2
  16. package/dist/conversation/types.d.ts.map +1 -1
  17. package/dist/conversation/types.js.map +1 -1
  18. package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.d.ts +14 -0
  19. package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.d.ts.map +1 -0
  20. package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.js +38 -0
  21. package/dist/heartbeat/hosted-heartbeat-agent-execution-transport.js.map +1 -0
  22. package/dist/heartbeat/hosted-heartbeat-task-service.d.ts +22 -0
  23. package/dist/heartbeat/hosted-heartbeat-task-service.d.ts.map +1 -0
  24. package/dist/heartbeat/hosted-heartbeat-task-service.js +96 -0
  25. package/dist/heartbeat/hosted-heartbeat-task-service.js.map +1 -0
  26. package/dist/heartbeat/index.d.ts +5 -0
  27. package/dist/heartbeat/index.d.ts.map +1 -0
  28. package/dist/heartbeat/index.js +4 -0
  29. package/dist/heartbeat/index.js.map +1 -0
  30. package/dist/heartbeat/types.d.ts +83 -0
  31. package/dist/heartbeat/types.d.ts.map +1 -0
  32. package/dist/heartbeat/types.js +17 -0
  33. package/dist/heartbeat/types.js.map +1 -0
  34. package/dist/http-sse/direct-http-execution-host.d.ts +4 -3
  35. package/dist/http-sse/direct-http-execution-host.d.ts.map +1 -1
  36. package/dist/http-sse/direct-http-execution-host.js +56 -21
  37. package/dist/http-sse/direct-http-execution-host.js.map +1 -1
  38. package/dist/http-sse/index.d.ts +1 -1
  39. package/dist/http-sse/index.d.ts.map +1 -1
  40. package/dist/http-sse/index.js.map +1 -1
  41. package/dist/http-sse/types.d.ts +11 -1
  42. package/dist/http-sse/types.d.ts.map +1 -1
  43. package/dist/http-sse/types.js.map +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/package.json +5 -1
  49. package/spec/v1/README.md +14 -4
  50. package/spec/v1/fixtures/manifest.json +12 -0
  51. package/spec/v1/fixtures/valid-heartbeat-request.json +23 -0
  52. package/spec/v1/fixtures/valid-heartbeat-result.sse +13 -0
  53. package/spec/v1/openapi.json +513 -6
  54. package/spec/v1/schema-bundle.json +499 -2
@@ -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 ConversationTurnSchema = z.object({
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 response = await this.#invoke(input);
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 (isExecutionHostTerminalEvent(event)) {
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 (isExecutionHostTerminalEvent(event)) {
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 = ExecutionHostStreamEventSchema.safeParse(decoded);
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 = isExecutionHostTerminalEvent(event);
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"]}
@@ -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,GAC9B,MAAM,YAAY,CAAC"}
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"]}
@@ -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,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,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,6BAA6B,GAAG;IAC1C,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,CAAC"}
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 { ExecutionHostStreamEvent } 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 DirectHttpExecutionHostConfig = {\n baseUrl: URL;\n localToken: string;\n fetch?: typeof fetch;\n};\n"]}
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
@@ -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.1.0",
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"
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. `durable-conversation-lifecycle.json` supplies the
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`. New workflows, transports, or identity
93
- forms require an explicit contract version decision; they are not silently
94
- added to this surface.
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
@@ -7,6 +7,12 @@
7
7
  "kind": "json-schema",
8
8
  "expected": "valid"
9
9
  },
10
+ {
11
+ "id": "valid-heartbeat-request",
12
+ "file": "valid-heartbeat-request.json",
13
+ "kind": "json-schema",
14
+ "expected": "valid"
15
+ },
10
16
  {
11
17
  "id": "request-authority-in-body",
12
18
  "file": "invalid-request-extra-field.json",
@@ -19,6 +25,12 @@
19
25
  "kind": "sse",
20
26
  "expected": "complete"
21
27
  },
28
+ {
29
+ "id": "valid-heartbeat-result",
30
+ "file": "valid-heartbeat-result.sse",
31
+ "kind": "sse",
32
+ "expected": "complete"
33
+ },
22
34
  {
23
35
  "id": "cancelled",
24
36
  "file": "cancelled.sse",
@@ -0,0 +1,23 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "heartbeat-task",
4
+ "invocationId": "heartbeat-execution-001",
5
+ "taskId": "heartbeat-task-001",
6
+ "task": "Review the workspace for actionable changes.",
7
+ "checkpoint": {
8
+ "version": 1,
9
+ "createdAt": "2026-08-10T04:00:00.000Z",
10
+ "state": {
11
+ "runId": "prior-run-001"
12
+ }
13
+ },
14
+ "runContext": {
15
+ "currentDateTime": "2026-08-10T04:00:00.000Z",
16
+ "intervalMs": 60000,
17
+ "continuationMode": "operator",
18
+ "previousRunId": "prior-run-001"
19
+ },
20
+ "model": "openai:gpt-5.6",
21
+ "maxSteps": 24,
22
+ "deadlineAt": "2026-08-10T04:10:00.000Z"
23
+ }
@@ -0,0 +1,13 @@
1
+ id: 0
2
+ event: accepted
3
+ data: {"schemaVersion":1,"invocationId":"heartbeat-execution-001","runId":"heartbeat-run-001","sequence":0,"timestamp":"2026-08-10T04:00:00.000Z","kind":"accepted"}
4
+
5
+ id: 1
6
+ event: activity
7
+ data: {"schemaVersion":1,"invocationId":"heartbeat-execution-001","runId":"heartbeat-run-001","sequence":1,"timestamp":"2026-08-10T04:00:00.000Z","kind":"activity","activity":{"type":"heartbeat.decision","decision":"continue"}}
8
+
9
+ id: 2
10
+ event: result
11
+ data: {"schemaVersion":1,"invocationId":"heartbeat-execution-001","runId":"heartbeat-run-001","sequence":2,"timestamp":"2026-08-10T04:00:00.000Z","kind":"result","result":{"decision":"continue","summary":"No operator action required.","checkpoint":{"version":1,"createdAt":"2026-08-10T04:00:00.000Z","state":{"runId":"heartbeat-run-001"}},"state":{"runId":"heartbeat-run-001","outcome":"done","summary":"No operator action required."}}}
12
+
13
+ : fixture-clean-eof