@heddleagent/execution-host-client 7.0.0 → 8.0.1

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 (79) hide show
  1. package/README.md +48 -34
  2. package/dist/cli/hostctl.d.ts +11 -0
  3. package/dist/cli/hostctl.d.ts.map +1 -0
  4. package/dist/cli/hostctl.js +62 -0
  5. package/dist/cli/hostctl.js.map +1 -0
  6. package/dist/contracts/index.d.ts +2 -0
  7. package/dist/contracts/index.d.ts.map +1 -1
  8. package/dist/contracts/index.js +9 -0
  9. package/dist/contracts/index.js.map +1 -1
  10. package/dist/coordinator/contracts.d.ts +148 -5
  11. package/dist/coordinator/contracts.d.ts.map +1 -1
  12. package/dist/coordinator/contracts.js +74 -3
  13. package/dist/coordinator/contracts.js.map +1 -1
  14. package/dist/coordinator/hosted-heartbeat-execution-client.d.ts +30 -0
  15. package/dist/coordinator/hosted-heartbeat-execution-client.d.ts.map +1 -0
  16. package/dist/coordinator/hosted-heartbeat-execution-client.js +240 -0
  17. package/dist/coordinator/hosted-heartbeat-execution-client.js.map +1 -0
  18. package/dist/coordinator/hosted-heartbeat-execution-service.d.ts +14 -0
  19. package/dist/coordinator/hosted-heartbeat-execution-service.d.ts.map +1 -0
  20. package/dist/coordinator/hosted-heartbeat-execution-service.js +100 -0
  21. package/dist/coordinator/hosted-heartbeat-execution-service.js.map +1 -0
  22. package/dist/coordinator/index.d.ts +5 -5
  23. package/dist/coordinator/index.d.ts.map +1 -1
  24. package/dist/coordinator/index.js +3 -3
  25. package/dist/coordinator/index.js.map +1 -1
  26. package/dist/coordinator/node/execution-http-service.d.ts +11 -0
  27. package/dist/coordinator/node/execution-http-service.d.ts.map +1 -0
  28. package/dist/coordinator/node/{delegation-http-service.js → execution-http-service.js} +52 -39
  29. package/dist/coordinator/node/execution-http-service.js.map +1 -0
  30. package/dist/coordinator/node/index.d.ts +2 -2
  31. package/dist/coordinator/node/index.d.ts.map +1 -1
  32. package/dist/coordinator/node/index.js +1 -1
  33. package/dist/coordinator/node/index.js.map +1 -1
  34. package/dist/coordinator/node/types.d.ts +10 -9
  35. package/dist/coordinator/node/types.d.ts.map +1 -1
  36. package/dist/coordinator/node/types.js.map +1 -1
  37. package/dist/coordinator/types.d.ts +51 -13
  38. package/dist/coordinator/types.d.ts.map +1 -1
  39. package/dist/coordinator/types.js.map +1 -1
  40. package/dist/host/schemas.d.ts.map +1 -1
  41. package/dist/host/schemas.js +2 -7
  42. package/dist/host/schemas.js.map +1 -1
  43. package/dist/http-sse/direct-http-execution-host.d.ts.map +1 -1
  44. package/dist/http-sse/direct-http-execution-host.js +6 -5
  45. package/dist/http-sse/direct-http-execution-host.js.map +1 -1
  46. package/dist/http-sse/types.d.ts +2 -0
  47. package/dist/http-sse/types.d.ts.map +1 -1
  48. package/dist/http-sse/types.js.map +1 -1
  49. package/dist/node/authority-key.d.ts.map +1 -1
  50. package/dist/node/authority-key.js +24 -49
  51. package/dist/node/authority-key.js.map +1 -1
  52. package/dist/node/environment-value.d.ts +17 -0
  53. package/dist/node/environment-value.d.ts.map +1 -0
  54. package/dist/node/environment-value.js +78 -0
  55. package/dist/node/environment-value.js.map +1 -0
  56. package/dist/node/index.d.ts +4 -0
  57. package/dist/node/index.d.ts.map +1 -1
  58. package/dist/node/index.js +2 -0
  59. package/dist/node/index.js.map +1 -1
  60. package/dist/node/local-credential-bundle.d.ts +33 -0
  61. package/dist/node/local-credential-bundle.d.ts.map +1 -0
  62. package/dist/node/local-credential-bundle.js +196 -0
  63. package/dist/node/local-credential-bundle.js.map +1 -0
  64. package/dist/node/owner-only-file.d.ts +17 -0
  65. package/dist/node/owner-only-file.d.ts.map +1 -0
  66. package/dist/node/owner-only-file.js +59 -0
  67. package/dist/node/owner-only-file.js.map +1 -0
  68. package/package.json +6 -1
  69. package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts +0 -21
  70. package/dist/coordinator/hosted-heartbeat-delegation-client.d.ts.map +0 -1
  71. package/dist/coordinator/hosted-heartbeat-delegation-client.js +0 -117
  72. package/dist/coordinator/hosted-heartbeat-delegation-client.js.map +0 -1
  73. package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts +0 -15
  74. package/dist/coordinator/hosted-heartbeat-delegation-service.d.ts.map +0 -1
  75. package/dist/coordinator/hosted-heartbeat-delegation-service.js +0 -81
  76. package/dist/coordinator/hosted-heartbeat-delegation-service.js.map +0 -1
  77. package/dist/coordinator/node/delegation-http-service.d.ts +0 -11
  78. package/dist/coordinator/node/delegation-http-service.d.ts.map +0 -1
  79. package/dist/coordinator/node/delegation-http-service.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-heartbeat-execution-service.js","sourceRoot":"","sources":["../../src/coordinator/hosted-heartbeat-execution-service.ts"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport { z } from 'zod';\nimport { HEARTBEAT_TASK_WORKFLOW, OpaqueIdSchema } from '../contracts/index.js';\nimport {\n HostedHeartbeatDelegationSchema,\n HostedHeartbeatExecutionDispositionSchema,\n HostedHeartbeatExecutionPreparationDecisionSchema,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionPreparationSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n HostedHeartbeatExecutionSettlementSchema,\n type HostedHeartbeatDelegation,\n type HostedHeartbeatExecutionPreparation,\n type HostedHeartbeatExecutionPreparationRequest,\n type HostedHeartbeatExecutionSettlement,\n type HostedHeartbeatExecutionSettlementRequest,\n} from './contracts.js';\nimport { createHostedRuntimeSessionId } from './runtime-session.js';\nimport type {\n HostedHeartbeatExecutionApi,\n HostedHeartbeatExecutionServiceConfig,\n} from './types.js';\n\nconst ExecutionServiceConfigSchema = z.object({\n runtimeSessionNamespace: OpaqueIdSchema,\n maxExecutionMs: z.number().int().min(1_000).max(Number.MAX_SAFE_INTEGER),\n}).strict();\n\n/**\n * Owns the generic product lifecycle edge for one Coordinator execution.\n * Product code decides whether work exists and how it settles; this service\n * alone constructs the Heddle authority bundle used by the Execution Host.\n */\nexport class HostedHeartbeatExecutionService\nimplements HostedHeartbeatExecutionApi {\n readonly #authority: HostedHeartbeatExecutionServiceConfig['authority'];\n readonly #lifecycle: HostedHeartbeatExecutionServiceConfig['lifecycle'];\n readonly #runtimeSessionNamespace: string;\n readonly #maxExecutionMs: number;\n readonly #now: () => Date;\n\n constructor(config: HostedHeartbeatExecutionServiceConfig) {\n const parsed = ExecutionServiceConfigSchema.parse({\n runtimeSessionNamespace: config.runtimeSessionNamespace,\n maxExecutionMs: config.maxExecutionMs,\n });\n this.#authority = config.authority;\n this.#lifecycle = config.lifecycle;\n this.#runtimeSessionNamespace = parsed.runtimeSessionNamespace;\n this.#maxExecutionMs = parsed.maxExecutionMs;\n this.#now = config.now ?? (() => new Date());\n }\n\n async prepare(\n rawInput: HostedHeartbeatExecutionPreparationRequest,\n rawSignal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionPreparation> {\n const input = HostedHeartbeatExecutionPreparationRequestSchema.parse(\n rawInput,\n );\n const signal = rawSignal ?? new AbortController().signal;\n signal.throwIfAborted();\n const decision = HostedHeartbeatExecutionPreparationDecisionSchema.parse(\n await this.#lifecycle.prepare({ ...input, signal }),\n );\n signal.throwIfAborted();\n if (decision.kind === 'skip') {\n return HostedHeartbeatExecutionPreparationSchema.parse({\n schemaVersion: 1,\n kind: 'skip',\n taskId: input.taskId,\n executionId: input.executionId,\n summary: decision.summary,\n });\n }\n\n return HostedHeartbeatExecutionPreparationSchema.parse({\n schemaVersion: 1,\n kind: 'execute',\n delegation: await this.#createDelegation(input, decision.authorization),\n });\n }\n\n async settle(\n rawInput: HostedHeartbeatExecutionSettlementRequest,\n rawSignal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionSettlement> {\n const input = HostedHeartbeatExecutionSettlementRequestSchema.parse(\n rawInput,\n );\n const signal = rawSignal ?? new AbortController().signal;\n signal.throwIfAborted();\n const disposition = HostedHeartbeatExecutionDispositionSchema.parse(\n await this.#lifecycle.settle({ ...input, signal }),\n );\n signal.throwIfAborted();\n return HostedHeartbeatExecutionSettlementSchema.parse({\n schemaVersion: 1,\n taskId: input.taskId,\n executionId: input.executionId,\n disposition,\n });\n }\n\n async #createDelegation(\n input: HostedHeartbeatExecutionPreparationRequest,\n authorization: Extract<\n z.infer<typeof HostedHeartbeatExecutionPreparationDecisionSchema>,\n { kind: 'execute' }\n >['authorization'],\n ): Promise<HostedHeartbeatDelegation> {\n const runtimeSessionId = createHostedRuntimeSessionId({\n namespace: this.#runtimeSessionNamespace,\n scope: authorization.scope,\n });\n const deadlineAt = dayjs(this.#now())\n .add(this.#maxExecutionMs, 'millisecond')\n .toISOString();\n const issued = await this.#authority.issue({\n scope: authorization.scope,\n runtimeSessionId,\n invocationId: input.executionId,\n workflow: HEARTBEAT_TASK_WORKFLOW,\n mcp: { allowedTools: authorization.allowedTools },\n });\n const mcpCapability = issued.mcpCapability();\n if (!mcpCapability || !issued.metadata.mcp) {\n throw new Error(\n 'Hosted heartbeat execution requires an MCP-capable authority.',\n );\n }\n\n return HostedHeartbeatDelegationSchema.parse({\n schemaVersion: 1,\n taskId: input.taskId,\n executionId: input.executionId,\n scope: authorization.scope,\n runtimeSessionId,\n deadlineAt,\n authority: {\n metadata: issued.metadata,\n executionAssertion: issued.executionAssertion(),\n mcpCapability,\n },\n });\n }\n}\n"]}
@@ -1,9 +1,9 @@
1
- export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_DELEGATIONS_PATH, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationAuthorizationSchema, HostedHeartbeatDelegationRequestSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
2
- export type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorRunView, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatDelegation, HostedHeartbeatDelegationAuthorization, HostedHeartbeatDelegationRequest, HostedHeartbeatDesiredTask, HostedHeartbeatDesiredTaskCatalog, } from './contracts.js';
1
+ export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatExecutionAuthorizationSchema, HostedHeartbeatExecutionDispositionSchema, HostedHeartbeatExecutionPreparationDecisionSchema, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionPreparationSchema, HostedHeartbeatExecutionResultSchema, HostedHeartbeatExecutionSettlementRequestSchema, HostedHeartbeatExecutionSettlementSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
2
+ export type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorRunView, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatDelegation, HostedHeartbeatExecutionAuthorization, HostedHeartbeatExecutionDisposition, HostedHeartbeatExecutionPreparation, HostedHeartbeatExecutionPreparationDecision, HostedHeartbeatExecutionPreparationRequest, HostedHeartbeatExecutionResult, HostedHeartbeatExecutionSettlement, HostedHeartbeatExecutionSettlementRequest, HostedHeartbeatDesiredTask, HostedHeartbeatDesiredTaskCatalog, } from './contracts.js';
3
3
  export { HostedHeartbeatCoordinatorClient, HostedHeartbeatCoordinatorRequestError, } from './hosted-heartbeat-coordinator-client.js';
4
- export { HostedHeartbeatDelegatedExecutionTransport, HostedHeartbeatDelegationClient, HostedHeartbeatDelegationRequestError, } from './hosted-heartbeat-delegation-client.js';
5
- export { HostedHeartbeatDelegationRejectedError, HostedHeartbeatDelegationService, } from './hosted-heartbeat-delegation-service.js';
4
+ export { HostedHeartbeatDelegatedExecution, HostedHeartbeatExecutionClient, HostedHeartbeatExecutionRequestError, } from './hosted-heartbeat-execution-client.js';
5
+ export { HostedHeartbeatExecutionService, } from './hosted-heartbeat-execution-service.js';
6
6
  export { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';
7
7
  export { createHostedRuntimeSessionId } from './runtime-session.js';
8
- export type { HostedHeartbeatCoordinatorClientConfig, HostedHeartbeatCoordinatorTaskApi, HostedHeartbeatDelegatedExecutionTransportConfig, HostedHeartbeatDelegatedExecutionTransportPort, HostedHeartbeatDelegationAuthorizationInput, HostedHeartbeatDelegationAuthorizer, HostedHeartbeatDelegationClientConfig, HostedHeartbeatDelegationIssuer, HostedHeartbeatDelegationServiceConfig, HostedHeartbeatTaskReconcilerConfig, HostedHeartbeatTaskReconciliation, HostedHeartbeatTaskReconciliationInput, } from './types.js';
8
+ export type { HostedHeartbeatCoordinatorClientConfig, HostedHeartbeatCoordinatorTaskApi, HostedHeartbeatCoordinatorExecutionContext, HostedHeartbeatDelegatedExecutionConfig, HostedHeartbeatExecutionTransportPort, HostedHeartbeatExecutionApi, HostedHeartbeatExecutionClientConfig, HostedHeartbeatExecutionPreparationInput, HostedHeartbeatExecutionServiceConfig, HostedHeartbeatExecutionSettlementInput, HostedHeartbeatProductExecutionLifecycle, HostedHeartbeatTaskReconcilerConfig, HostedHeartbeatTaskReconciliation, HostedHeartbeatTaskReconciliationInput, } from './types.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,iCAAiC,EACjC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,4CAA4C,EAC5C,sCAAsC,EACtC,+BAA+B,EAC/B,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mCAAmC,EACnC,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,yBAAyB,EACzB,sCAAsC,EACtC,gCAAgC,EAChC,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,0CAA0C,EAC1C,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,sCAAsC,EACtC,gCAAgC,GACjC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,sCAAsC,EACtC,iCAAiC,EACjC,gDAAgD,EAChD,8CAA8C,EAC9C,2CAA2C,EAC3C,mCAAmC,EACnC,qCAAqC,EACrC,+BAA+B,EAC/B,sCAAsC,EACtC,mCAAmC,EACnC,iCAAiC,EACjC,sCAAsC,GACvC,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,gCAAgC,EAChC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,+BAA+B,EAC/B,2CAA2C,EAC3C,yCAAyC,EACzC,iDAAiD,EACjD,gDAAgD,EAChD,yCAAyC,EACzC,oCAAoC,EACpC,+CAA+C,EAC/C,wCAAwC,EACxC,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mCAAmC,EACnC,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,kCAAkC,EAClC,yBAAyB,EACzB,qCAAqC,EACrC,mCAAmC,EACnC,mCAAmC,EACnC,2CAA2C,EAC3C,0CAA0C,EAC1C,8BAA8B,EAC9B,kCAAkC,EAClC,yCAAyC,EACzC,0BAA0B,EAC1B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,+BAA+B,GAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,sCAAsC,EACtC,iCAAiC,EACjC,0CAA0C,EAC1C,uCAAuC,EACvC,qCAAqC,EACrC,2BAA2B,EAC3B,oCAAoC,EACpC,wCAAwC,EACxC,qCAAqC,EACrC,uCAAuC,EACvC,wCAAwC,EACxC,mCAAmC,EACnC,iCAAiC,EACjC,sCAAsC,GACvC,MAAM,YAAY,CAAC"}
@@ -1,7 +1,7 @@
1
- export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_DELEGATIONS_PATH, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationAuthorizationSchema, HostedHeartbeatDelegationRequestSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
1
+ export { HOSTED_HEARTBEAT_COORDINATOR_PATHS, HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatCoordinatorRunViewSchema, HostedHeartbeatCoordinatorStateResponseSchema, HostedHeartbeatCoordinatorStateSchema, HostedHeartbeatCoordinatorTaskDetailSchema, HostedHeartbeatCoordinatorTaskInputSchema, HostedHeartbeatCoordinatorTaskListSchema, HostedHeartbeatCoordinatorTaskResultSchema, HostedHeartbeatCoordinatorTaskStatusSchema, HostedHeartbeatCoordinatorTaskViewSchema, HostedHeartbeatDelegationSchema, HostedHeartbeatExecutionAuthorizationSchema, HostedHeartbeatExecutionDispositionSchema, HostedHeartbeatExecutionPreparationDecisionSchema, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionPreparationSchema, HostedHeartbeatExecutionResultSchema, HostedHeartbeatExecutionSettlementRequestSchema, HostedHeartbeatExecutionSettlementSchema, HostedHeartbeatDesiredTaskCatalogSchema, HostedHeartbeatDesiredTaskSchema, } from './contracts.js';
2
2
  export { HostedHeartbeatCoordinatorClient, HostedHeartbeatCoordinatorRequestError, } from './hosted-heartbeat-coordinator-client.js';
3
- export { HostedHeartbeatDelegatedExecutionTransport, HostedHeartbeatDelegationClient, HostedHeartbeatDelegationRequestError, } from './hosted-heartbeat-delegation-client.js';
4
- export { HostedHeartbeatDelegationRejectedError, HostedHeartbeatDelegationService, } from './hosted-heartbeat-delegation-service.js';
3
+ export { HostedHeartbeatDelegatedExecution, HostedHeartbeatExecutionClient, HostedHeartbeatExecutionRequestError, } from './hosted-heartbeat-execution-client.js';
4
+ export { HostedHeartbeatExecutionService, } from './hosted-heartbeat-execution-service.js';
5
5
  export { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';
6
6
  export { createHostedRuntimeSessionId } from './runtime-session.js';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,iCAAiC,EACjC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,4CAA4C,EAC5C,sCAAsC,EACtC,+BAA+B,EAC/B,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AAaxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,0CAA0C,EAC1C,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,sCAAsC,EACtC,gCAAgC,GACjC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export {\n HOSTED_HEARTBEAT_COORDINATOR_PATHS,\n HOSTED_HEARTBEAT_DELEGATIONS_PATH,\n HostedHeartbeatCoordinatorRunViewSchema,\n HostedHeartbeatCoordinatorStateResponseSchema,\n HostedHeartbeatCoordinatorStateSchema,\n HostedHeartbeatCoordinatorTaskDetailSchema,\n HostedHeartbeatCoordinatorTaskInputSchema,\n HostedHeartbeatCoordinatorTaskListSchema,\n HostedHeartbeatCoordinatorTaskResultSchema,\n HostedHeartbeatCoordinatorTaskStatusSchema,\n HostedHeartbeatCoordinatorTaskViewSchema,\n HostedHeartbeatDelegationAuthorizationSchema,\n HostedHeartbeatDelegationRequestSchema,\n HostedHeartbeatDelegationSchema,\n HostedHeartbeatDesiredTaskCatalogSchema,\n HostedHeartbeatDesiredTaskSchema,\n} from './contracts.js';\nexport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorRunView,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatDelegation,\n HostedHeartbeatDelegationAuthorization,\n HostedHeartbeatDelegationRequest,\n HostedHeartbeatDesiredTask,\n HostedHeartbeatDesiredTaskCatalog,\n} from './contracts.js';\nexport {\n HostedHeartbeatCoordinatorClient,\n HostedHeartbeatCoordinatorRequestError,\n} from './hosted-heartbeat-coordinator-client.js';\nexport {\n HostedHeartbeatDelegatedExecutionTransport,\n HostedHeartbeatDelegationClient,\n HostedHeartbeatDelegationRequestError,\n} from './hosted-heartbeat-delegation-client.js';\nexport {\n HostedHeartbeatDelegationRejectedError,\n HostedHeartbeatDelegationService,\n} from './hosted-heartbeat-delegation-service.js';\nexport { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';\nexport { createHostedRuntimeSessionId } from './runtime-session.js';\nexport type {\n HostedHeartbeatCoordinatorClientConfig,\n HostedHeartbeatCoordinatorTaskApi,\n HostedHeartbeatDelegatedExecutionTransportConfig,\n HostedHeartbeatDelegatedExecutionTransportPort,\n HostedHeartbeatDelegationAuthorizationInput,\n HostedHeartbeatDelegationAuthorizer,\n HostedHeartbeatDelegationClientConfig,\n HostedHeartbeatDelegationIssuer,\n HostedHeartbeatDelegationServiceConfig,\n HostedHeartbeatTaskReconcilerConfig,\n HostedHeartbeatTaskReconciliation,\n HostedHeartbeatTaskReconciliationInput,\n} from './types.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,gCAAgC,EAChC,uCAAuC,EACvC,6CAA6C,EAC7C,qCAAqC,EACrC,0CAA0C,EAC1C,yCAAyC,EACzC,wCAAwC,EACxC,0CAA0C,EAC1C,0CAA0C,EAC1C,wCAAwC,EACxC,+BAA+B,EAC/B,2CAA2C,EAC3C,yCAAyC,EACzC,iDAAiD,EACjD,gDAAgD,EAChD,yCAAyC,EACzC,oCAAoC,EACpC,+CAA+C,EAC/C,wCAAwC,EACxC,uCAAuC,EACvC,gCAAgC,GACjC,MAAM,gBAAgB,CAAC;AAmBxB,OAAO,EACL,gCAAgC,EAChC,sCAAsC,GACvC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,+BAA+B,GAChC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export {\n HOSTED_HEARTBEAT_COORDINATOR_PATHS,\n HOSTED_HEARTBEAT_EXECUTION_PATHS,\n HostedHeartbeatCoordinatorRunViewSchema,\n HostedHeartbeatCoordinatorStateResponseSchema,\n HostedHeartbeatCoordinatorStateSchema,\n HostedHeartbeatCoordinatorTaskDetailSchema,\n HostedHeartbeatCoordinatorTaskInputSchema,\n HostedHeartbeatCoordinatorTaskListSchema,\n HostedHeartbeatCoordinatorTaskResultSchema,\n HostedHeartbeatCoordinatorTaskStatusSchema,\n HostedHeartbeatCoordinatorTaskViewSchema,\n HostedHeartbeatDelegationSchema,\n HostedHeartbeatExecutionAuthorizationSchema,\n HostedHeartbeatExecutionDispositionSchema,\n HostedHeartbeatExecutionPreparationDecisionSchema,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionPreparationSchema,\n HostedHeartbeatExecutionResultSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n HostedHeartbeatExecutionSettlementSchema,\n HostedHeartbeatDesiredTaskCatalogSchema,\n HostedHeartbeatDesiredTaskSchema,\n} from './contracts.js';\nexport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorRunView,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatDelegation,\n HostedHeartbeatExecutionAuthorization,\n HostedHeartbeatExecutionDisposition,\n HostedHeartbeatExecutionPreparation,\n HostedHeartbeatExecutionPreparationDecision,\n HostedHeartbeatExecutionPreparationRequest,\n HostedHeartbeatExecutionResult,\n HostedHeartbeatExecutionSettlement,\n HostedHeartbeatExecutionSettlementRequest,\n HostedHeartbeatDesiredTask,\n HostedHeartbeatDesiredTaskCatalog,\n} from './contracts.js';\nexport {\n HostedHeartbeatCoordinatorClient,\n HostedHeartbeatCoordinatorRequestError,\n} from './hosted-heartbeat-coordinator-client.js';\nexport {\n HostedHeartbeatDelegatedExecution,\n HostedHeartbeatExecutionClient,\n HostedHeartbeatExecutionRequestError,\n} from './hosted-heartbeat-execution-client.js';\nexport {\n HostedHeartbeatExecutionService,\n} from './hosted-heartbeat-execution-service.js';\nexport { HostedHeartbeatTaskReconciler } from './hosted-heartbeat-task-reconciler.js';\nexport { createHostedRuntimeSessionId } from './runtime-session.js';\nexport type {\n HostedHeartbeatCoordinatorClientConfig,\n HostedHeartbeatCoordinatorTaskApi,\n HostedHeartbeatCoordinatorExecutionContext,\n HostedHeartbeatDelegatedExecutionConfig,\n HostedHeartbeatExecutionTransportPort,\n HostedHeartbeatExecutionApi,\n HostedHeartbeatExecutionClientConfig,\n HostedHeartbeatExecutionPreparationInput,\n HostedHeartbeatExecutionServiceConfig,\n HostedHeartbeatExecutionSettlementInput,\n HostedHeartbeatProductExecutionLifecycle,\n HostedHeartbeatTaskReconcilerConfig,\n HostedHeartbeatTaskReconciliation,\n HostedHeartbeatTaskReconciliationInput,\n} from './types.js';\n"]}
@@ -0,0 +1,11 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { NodeHostedHeartbeatExecutionHttpHandler, NodeHostedHeartbeatExecutionHttpServiceConfig } from './types.js';
3
+ /** Standard authenticated Node HTTP edge for product-owned work lifecycle. */
4
+ export declare class NodeHostedHeartbeatExecutionHttpService implements NodeHostedHeartbeatExecutionHttpHandler {
5
+ #private;
6
+ constructor(config: NodeHostedHeartbeatExecutionHttpServiceConfig);
7
+ handle(request: IncomingMessage, response: ServerResponse): boolean;
8
+ handleExecution(request: IncomingMessage, response: ServerResponse): void;
9
+ close(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=execution-http-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-http-service.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/execution-http-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkBjE,OAAO,KAAK,EAEV,uCAAuC,EACvC,6CAA6C,EAC9C,MAAM,YAAY,CAAC;AAYpB,8EAA8E;AAC9E,qBAAa,uCACb,YAAW,uCAAuC;;gBAcpC,MAAM,EAAE,6CAA6C;IAmBjE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO;IASnE,eAAe,CACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,IAAI;IAUP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA2IvB"}
@@ -1,35 +1,60 @@
1
1
  import { createHash, timingSafeEqual } from 'node:crypto';
2
2
  import { z, ZodError } from 'zod';
3
- import { HOSTED_HEARTBEAT_DELEGATIONS_PATH, HostedHeartbeatDelegationRequestSchema, } from '../contracts.js';
4
- import { HostedHeartbeatDelegationRejectedError, } from '../hosted-heartbeat-delegation-service.js';
3
+ import { HOSTED_HEARTBEAT_EXECUTION_PATHS, HostedHeartbeatExecutionPreparationRequestSchema, HostedHeartbeatExecutionSettlementRequestSchema, } from '../contracts.js';
5
4
  import { HostedHeartbeatServiceTokenSchema } from '../service-token.js';
6
5
  import { NodeHttpPathSchema, NodeHttpRequestError, errorType, readJsonBody, readPathname, takeAuthorization, writeJson, writeJsonError, } from '../../node/http-utils.js';
7
6
  const DEFAULT_MAX_BODY_BYTES = 16 * 1_024;
8
- /** Standard authenticated Node HTTP edge for product-owned run authority. */
9
- export class NodeHostedHeartbeatDelegationHttpService {
10
- #delegations;
7
+ /** Standard authenticated Node HTTP edge for product-owned work lifecycle. */
8
+ export class NodeHostedHeartbeatExecutionHttpService {
9
+ #executions;
11
10
  #tokenDigest;
12
- #path;
11
+ #paths;
13
12
  #maxBodyBytes;
14
13
  #reportFailure;
15
14
  #active = new Set();
16
15
  #closed = false;
17
16
  #closePromise;
18
17
  constructor(config) {
19
- this.#delegations = config.delegations;
18
+ this.#executions = config.executions;
20
19
  this.#tokenDigest = digest(HostedHeartbeatServiceTokenSchema.parse(config.apiToken));
21
- this.#path = NodeHttpPathSchema.parse(config.path ?? HOSTED_HEARTBEAT_DELEGATIONS_PATH);
20
+ this.#paths = {
21
+ prepare: NodeHttpPathSchema.parse(config.preparePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.prepare),
22
+ settle: NodeHttpPathSchema.parse(config.settlePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.settle),
23
+ };
22
24
  this.#maxBodyBytes = z.number().int().min(1).max(1_048_576).parse(config.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES);
23
25
  this.#reportFailure = config.reportFailure;
24
26
  }
25
27
  handle(request, response) {
26
- if (readPathname(request.url) !== this.#path) {
28
+ const operation = this.#operation(readPathname(request.url));
29
+ if (!operation) {
27
30
  return false;
28
31
  }
29
- this.handleDelegation(request, response);
32
+ this.#start(operation, request, response);
30
33
  return true;
31
34
  }
32
- handleDelegation(request, response) {
35
+ handleExecution(request, response) {
36
+ const operation = this.#operation(readPathname(request.url));
37
+ if (!operation) {
38
+ request.resume();
39
+ writeJsonError(response, 404, 'Heartbeat execution route not found.');
40
+ return;
41
+ }
42
+ this.#start(operation, request, response);
43
+ }
44
+ close() {
45
+ if (!this.#closePromise) {
46
+ this.#closed = true;
47
+ const active = [...this.#active];
48
+ active.forEach(({ abortController, request, response }) => {
49
+ abortController.abort(new Error('The heartbeat execution service is stopping.'));
50
+ request.destroy();
51
+ response.destroy();
52
+ });
53
+ this.#closePromise = Promise.allSettled(active.map(({ pending }) => pending)).then(() => undefined);
54
+ }
55
+ return this.#closePromise;
56
+ }
57
+ #start(operation, request, response) {
33
58
  if (this.#closed) {
34
59
  request.resume();
35
60
  writeJsonError(response, 503, 'Hosted execution is unavailable.');
@@ -48,7 +73,7 @@ export class NodeHostedHeartbeatDelegationHttpService {
48
73
  }
49
74
  catch (error) {
50
75
  request.resume();
51
- writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat delegation request.');
76
+ writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat execution request.');
52
77
  return;
53
78
  }
54
79
  if (!this.#authenticates(authorization)) {
@@ -59,7 +84,7 @@ export class NodeHostedHeartbeatDelegationHttpService {
59
84
  return;
60
85
  }
61
86
  const abortController = new AbortController();
62
- const abort = () => abortController.abort(new Error('The heartbeat delegation request closed.'));
87
+ const abort = () => abortController.abort(new Error('The heartbeat execution request closed.'));
63
88
  request.once('aborted', abort);
64
89
  response.once('close', abort);
65
90
  const active = {
@@ -68,48 +93,36 @@ export class NodeHostedHeartbeatDelegationHttpService {
68
93
  response,
69
94
  pending: Promise.resolve(),
70
95
  };
71
- active.pending = this.#serve(request, response, abortController.signal).finally(() => {
96
+ active.pending = this.#serve(operation, request, response, abortController.signal).finally(() => {
72
97
  request.removeListener('aborted', abort);
73
98
  response.removeListener('close', abort);
74
99
  this.#active.delete(active);
75
100
  });
76
101
  this.#active.add(active);
77
102
  }
78
- close() {
79
- if (!this.#closePromise) {
80
- this.#closed = true;
81
- const active = [...this.#active];
82
- active.forEach(({ abortController, request, response }) => {
83
- abortController.abort(new Error('The heartbeat delegation service is stopping.'));
84
- request.destroy();
85
- response.destroy();
86
- });
87
- this.#closePromise = Promise.allSettled(active.map(({ pending }) => pending)).then(() => undefined);
88
- }
89
- return this.#closePromise;
90
- }
91
- async #serve(request, response, signal) {
103
+ async #serve(operation, request, response, signal) {
92
104
  try {
93
- const input = HostedHeartbeatDelegationRequestSchema.parse(await readJsonBody(request, this.#maxBodyBytes, signal));
94
- const delegation = await this.#delegations.issue(input, signal);
95
- writeJson(response, 200, delegation);
105
+ const body = await readJsonBody(request, this.#maxBodyBytes, signal);
106
+ const result = operation === 'prepare'
107
+ ? await this.#executions.prepare(HostedHeartbeatExecutionPreparationRequestSchema.parse(body), signal)
108
+ : await this.#executions.settle(HostedHeartbeatExecutionSettlementRequestSchema.parse(body), signal);
109
+ writeJson(response, 200, result);
96
110
  }
97
111
  catch (error) {
98
112
  if (signal.aborted) {
99
113
  return;
100
114
  }
101
- if (error instanceof HostedHeartbeatDelegationRejectedError) {
102
- writeJsonError(response, 403, error.message);
103
- return;
104
- }
105
115
  if (error instanceof NodeHttpRequestError || error instanceof ZodError) {
106
- writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat delegation request.');
116
+ writeJsonError(response, error instanceof NodeHttpRequestError ? error.statusCode : 400, 'Invalid heartbeat execution request.');
107
117
  return;
108
118
  }
109
- this.#report({ phase: 'delegation', errorType: errorType(error) });
110
- writeJsonError(response, 500, 'Heartbeat delegation failed.');
119
+ this.#report({ phase: operation, errorType: errorType(error) });
120
+ writeJsonError(response, 500, `Heartbeat execution ${operation} failed.`);
111
121
  }
112
122
  }
123
+ #operation(pathname) {
124
+ return Object.entries(this.#paths).find(([, path]) => path === pathname)?.[0];
125
+ }
113
126
  #authenticates(authorization) {
114
127
  const token = /^Bearer ([^\s]+)$/i.exec(authorization?.trim() ?? '')?.[1];
115
128
  return token
@@ -128,4 +141,4 @@ export class NodeHostedHeartbeatDelegationHttpService {
128
141
  function digest(value) {
129
142
  return createHash('sha256').update(value, 'utf8').digest();
130
143
  }
131
- //# sourceMappingURL=delegation-http-service.js.map
144
+ //# sourceMappingURL=execution-http-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-http-service.js","sourceRoot":"","sources":["../../../src/coordinator/node/execution-http-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, timingSafeEqual } from 'node:crypto';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { z, ZodError } from 'zod';\nimport {\n HOSTED_HEARTBEAT_EXECUTION_PATHS,\n HostedHeartbeatExecutionPreparationRequestSchema,\n HostedHeartbeatExecutionSettlementRequestSchema,\n} from '../contracts.js';\nimport { HostedHeartbeatServiceTokenSchema } from '../service-token.js';\nimport {\n NodeHttpPathSchema,\n NodeHttpRequestError,\n errorType,\n readJsonBody,\n readPathname,\n takeAuthorization,\n writeJson,\n writeJsonError,\n} from '../../node/http-utils.js';\nimport type {\n NodeHostedHeartbeatExecutionFailure,\n NodeHostedHeartbeatExecutionHttpHandler,\n NodeHostedHeartbeatExecutionHttpServiceConfig,\n} from './types.js';\n\nconst DEFAULT_MAX_BODY_BYTES = 16 * 1_024;\n\ntype ExecutionOperation = 'prepare' | 'settle';\ntype ActiveRequest = {\n abortController: AbortController;\n request: IncomingMessage;\n response: ServerResponse;\n pending: Promise<void>;\n};\n\n/** Standard authenticated Node HTTP edge for product-owned work lifecycle. */\nexport class NodeHostedHeartbeatExecutionHttpService\nimplements NodeHostedHeartbeatExecutionHttpHandler {\n readonly #executions: NodeHostedHeartbeatExecutionHttpServiceConfig[\n 'executions'\n ];\n readonly #tokenDigest: Buffer;\n readonly #paths: Record<ExecutionOperation, string>;\n readonly #maxBodyBytes: number;\n readonly #reportFailure: NodeHostedHeartbeatExecutionHttpServiceConfig[\n 'reportFailure'\n ];\n readonly #active = new Set<ActiveRequest>();\n #closed = false;\n #closePromise: Promise<void> | undefined;\n\n constructor(config: NodeHostedHeartbeatExecutionHttpServiceConfig) {\n this.#executions = config.executions;\n this.#tokenDigest = digest(\n HostedHeartbeatServiceTokenSchema.parse(config.apiToken),\n );\n this.#paths = {\n prepare: NodeHttpPathSchema.parse(\n config.preparePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.prepare,\n ),\n settle: NodeHttpPathSchema.parse(\n config.settlePath ?? HOSTED_HEARTBEAT_EXECUTION_PATHS.settle,\n ),\n };\n this.#maxBodyBytes = z.number().int().min(1).max(1_048_576).parse(\n config.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES,\n );\n this.#reportFailure = config.reportFailure;\n }\n\n handle(request: IncomingMessage, response: ServerResponse): boolean {\n const operation = this.#operation(readPathname(request.url));\n if (!operation) {\n return false;\n }\n this.#start(operation, request, response);\n return true;\n }\n\n handleExecution(\n request: IncomingMessage,\n response: ServerResponse,\n ): void {\n const operation = this.#operation(readPathname(request.url));\n if (!operation) {\n request.resume();\n writeJsonError(response, 404, 'Heartbeat execution route not found.');\n return;\n }\n this.#start(operation, request, response);\n }\n\n close(): Promise<void> {\n if (!this.#closePromise) {\n this.#closed = true;\n const active = [...this.#active];\n active.forEach(({ abortController, request, response }) => {\n abortController.abort(\n new Error('The heartbeat execution service is stopping.'),\n );\n request.destroy();\n response.destroy();\n });\n this.#closePromise = Promise.allSettled(\n active.map(({ pending }) => pending),\n ).then(() => undefined);\n }\n return this.#closePromise;\n }\n\n #start(\n operation: ExecutionOperation,\n request: IncomingMessage,\n response: ServerResponse,\n ): void {\n if (this.#closed) {\n request.resume();\n writeJsonError(response, 503, 'Hosted execution is unavailable.');\n return;\n }\n\n let authorization: string | undefined;\n try {\n authorization = takeAuthorization(request);\n if (request.method !== 'POST') {\n request.resume();\n writeJsonError(response, 405, 'Method not allowed.', {\n Allow: 'POST',\n });\n return;\n }\n } catch (error) {\n request.resume();\n writeJsonError(\n response,\n error instanceof NodeHttpRequestError ? error.statusCode : 400,\n 'Invalid heartbeat execution request.',\n );\n return;\n }\n if (!this.#authenticates(authorization)) {\n request.resume();\n writeJsonError(response, 401, 'Authentication is required.', {\n 'WWW-Authenticate': 'Bearer',\n });\n return;\n }\n\n const abortController = new AbortController();\n const abort = () => abortController.abort(\n new Error('The heartbeat execution request closed.'),\n );\n request.once('aborted', abort);\n response.once('close', abort);\n const active: ActiveRequest = {\n abortController,\n request,\n response,\n pending: Promise.resolve(),\n };\n active.pending = this.#serve(\n operation,\n request,\n response,\n abortController.signal,\n ).finally(() => {\n request.removeListener('aborted', abort);\n response.removeListener('close', abort);\n this.#active.delete(active);\n });\n this.#active.add(active);\n }\n\n async #serve(\n operation: ExecutionOperation,\n request: IncomingMessage,\n response: ServerResponse,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n const body = await readJsonBody(request, this.#maxBodyBytes, signal);\n const result = operation === 'prepare'\n ? await this.#executions.prepare(\n HostedHeartbeatExecutionPreparationRequestSchema.parse(body),\n signal,\n )\n : await this.#executions.settle(\n HostedHeartbeatExecutionSettlementRequestSchema.parse(body),\n signal,\n );\n writeJson(response, 200, result);\n } catch (error) {\n if (signal.aborted) {\n return;\n }\n if (error instanceof NodeHttpRequestError || error instanceof ZodError) {\n writeJsonError(\n response,\n error instanceof NodeHttpRequestError ? error.statusCode : 400,\n 'Invalid heartbeat execution request.',\n );\n return;\n }\n this.#report({ phase: operation, errorType: errorType(error) });\n writeJsonError(response, 500, `Heartbeat execution ${operation} failed.`);\n }\n }\n\n #operation(pathname: string | undefined): ExecutionOperation | undefined {\n return (Object.entries(this.#paths) as Array<[\n ExecutionOperation,\n string,\n ]>).find(([, path]) => path === pathname)?.[0];\n }\n\n #authenticates(authorization: string | undefined): boolean {\n const token = /^Bearer ([^\\s]+)$/i.exec(\n authorization?.trim() ?? '',\n )?.[1];\n return token\n ? timingSafeEqual(digest(token), this.#tokenDigest)\n : false;\n }\n\n #report(failure: NodeHostedHeartbeatExecutionFailure): void {\n try {\n this.#reportFailure?.(Object.freeze({ ...failure }));\n } catch {\n // Observability must not change request settlement.\n }\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash('sha256').update(value, 'utf8').digest();\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { NodeHostedHeartbeatDelegationHttpService } from './delegation-http-service.js';
1
+ export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';
2
2
  export { takeHostedHeartbeatServiceToken } from './environment.js';
3
- export type { NodeHostedHeartbeatDelegationFailure, NodeHostedHeartbeatDelegationHttpHandler, NodeHostedHeartbeatDelegationHttpServiceConfig, } from './types.js';
3
+ export type { NodeHostedHeartbeatExecutionFailure, NodeHostedHeartbeatExecutionHttpHandler, NodeHostedHeartbeatExecutionHttpServiceConfig, } from './types.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,oCAAoC,EACpC,wCAAwC,EACxC,8CAA8C,GAC/C,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uCAAuC,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,mCAAmC,EACnC,uCAAuC,EACvC,6CAA6C,GAC9C,MAAM,YAAY,CAAC"}
@@ -1,3 +1,3 @@
1
- export { NodeHostedHeartbeatDelegationHttpService } from './delegation-http-service.js';
1
+ export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';
2
2
  export { takeHostedHeartbeatServiceToken } from './environment.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { NodeHostedHeartbeatDelegationHttpService } from './delegation-http-service.js';\nexport { takeHostedHeartbeatServiceToken } from './environment.js';\nexport type {\n NodeHostedHeartbeatDelegationFailure,\n NodeHostedHeartbeatDelegationHttpHandler,\n NodeHostedHeartbeatDelegationHttpServiceConfig,\n} from './types.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordinator/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uCAAuC,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { NodeHostedHeartbeatExecutionHttpService } from './execution-http-service.js';\nexport { takeHostedHeartbeatServiceToken } from './environment.js';\nexport type {\n NodeHostedHeartbeatExecutionFailure,\n NodeHostedHeartbeatExecutionHttpHandler,\n NodeHostedHeartbeatExecutionHttpServiceConfig,\n} from './types.js';\n"]}
@@ -1,20 +1,21 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import type { HostedHeartbeatDelegationIssuer } from '../types.js';
3
- export type NodeHostedHeartbeatDelegationFailure = {
4
- phase: 'delegation';
2
+ import type { HostedHeartbeatExecutionApi } from '../types.js';
3
+ export type NodeHostedHeartbeatExecutionFailure = {
4
+ phase: 'prepare' | 'settle';
5
5
  errorType: string;
6
6
  };
7
- export type NodeHostedHeartbeatDelegationHttpServiceConfig = {
8
- delegations: HostedHeartbeatDelegationIssuer;
7
+ export type NodeHostedHeartbeatExecutionHttpServiceConfig = {
8
+ executions: HostedHeartbeatExecutionApi;
9
9
  apiToken: string;
10
- path?: string;
10
+ preparePath?: string;
11
+ settlePath?: string;
11
12
  maxBodyBytes?: number;
12
13
  /** Receives credential-free operational metadata, never the raw error. */
13
- reportFailure?: (failure: NodeHostedHeartbeatDelegationFailure) => void;
14
+ reportFailure?: (failure: NodeHostedHeartbeatExecutionFailure) => void;
14
15
  };
15
- export interface NodeHostedHeartbeatDelegationHttpHandler {
16
+ export interface NodeHostedHeartbeatExecutionHttpHandler {
16
17
  handle(request: IncomingMessage, response: ServerResponse): boolean;
17
- handleDelegation(request: IncomingMessage, response: ServerResponse): void;
18
+ handleExecution(request: IncomingMessage, response: ServerResponse): void;
18
19
  close(): Promise<void>;
19
20
  }
20
21
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,MAAM,oCAAoC,GAAG;IACjD,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,8CAA8C,GAAG;IAC3D,WAAW,EAAE,+BAA+B,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,oCAAoC,KAAK,IAAI,CAAC;CACzE,CAAC;AAEF,MAAM,WAAW,wCAAwC;IACvD,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IACpE,gBAAgB,CACd,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAAC;IACR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,MAAM,mCAAmC,GAAG;IAChD,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6CAA6C,GAAG;IAC1D,UAAU,EAAE,2BAA2B,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,mCAAmC,KAAK,IAAI,CAAC;CACxE,CAAC;AAEF,MAAM,WAAW,uCAAuC;IACtD,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IACpE,eAAe,CACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAAC;IACR,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { HostedHeartbeatDelegationIssuer } from '../types.js';\n\nexport type NodeHostedHeartbeatDelegationFailure = {\n phase: 'delegation';\n errorType: string;\n};\n\nexport type NodeHostedHeartbeatDelegationHttpServiceConfig = {\n delegations: HostedHeartbeatDelegationIssuer;\n apiToken: string;\n path?: string;\n maxBodyBytes?: number;\n /** Receives credential-free operational metadata, never the raw error. */\n reportFailure?: (failure: NodeHostedHeartbeatDelegationFailure) => void;\n};\n\nexport interface NodeHostedHeartbeatDelegationHttpHandler {\n handle(request: IncomingMessage, response: ServerResponse): boolean;\n handleDelegation(\n request: IncomingMessage,\n response: ServerResponse,\n ): void;\n close(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/coordinator/node/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { HostedHeartbeatExecutionApi } from '../types.js';\n\nexport type NodeHostedHeartbeatExecutionFailure = {\n phase: 'prepare' | 'settle';\n errorType: string;\n};\n\nexport type NodeHostedHeartbeatExecutionHttpServiceConfig = {\n executions: HostedHeartbeatExecutionApi;\n apiToken: string;\n preparePath?: string;\n settlePath?: string;\n maxBodyBytes?: number;\n /** Receives credential-free operational metadata, never the raw error. */\n reportFailure?: (failure: NodeHostedHeartbeatExecutionFailure) => void;\n};\n\nexport interface NodeHostedHeartbeatExecutionHttpHandler {\n handle(request: IncomingMessage, response: ServerResponse): boolean;\n handleExecution(\n request: IncomingMessage,\n response: ServerResponse,\n ): void;\n close(): Promise<void>;\n}\n"]}
@@ -2,7 +2,7 @@ import type { ExecutionAuthorityIssuer } from '../authority/index.js';
2
2
  import type { HostedModelCredentialProvider } from '../conversation/index.js';
3
3
  import type { HostedHeartbeatAgentExecutionTransportInput } from '../heartbeat/index.js';
4
4
  import type { HeartbeatExecutionHost } from '../http-sse/index.js';
5
- import type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatDelegation, HostedHeartbeatDelegationAuthorization, HostedHeartbeatDelegationRequest, HostedHeartbeatDesiredTask } from './contracts.js';
5
+ import type { HostedHeartbeatCoordinatorTaskInput, HostedHeartbeatCoordinatorState, HostedHeartbeatCoordinatorTaskDetail, HostedHeartbeatCoordinatorTaskView, HostedHeartbeatExecutionPreparation, HostedHeartbeatExecutionPreparationDecision, HostedHeartbeatExecutionPreparationRequest, HostedHeartbeatExecutionSettlement, HostedHeartbeatExecutionSettlementRequest, HostedHeartbeatDesiredTask } from './contracts.js';
6
6
  export type HostedHeartbeatCoordinatorClientConfig = {
7
7
  baseUrl: URL;
8
8
  apiToken: string;
@@ -32,36 +32,74 @@ export type HostedHeartbeatTaskReconciliation = {
32
32
  export type HostedHeartbeatTaskReconcilerConfig = {
33
33
  coordinator: Pick<HostedHeartbeatCoordinatorTaskApi, 'listTasks' | 'upsertTask' | 'deleteTask' | 'pause' | 'resume'>;
34
34
  };
35
- export type HostedHeartbeatDelegationAuthorizationInput = {
35
+ export type HostedHeartbeatExecutionPreparationInput = {
36
36
  taskId: string;
37
37
  executionId: string;
38
+ interruptedExecutionId?: string;
38
39
  signal: AbortSignal;
39
40
  };
40
- export interface HostedHeartbeatDelegationAuthorizer {
41
- authorize(input: HostedHeartbeatDelegationAuthorizationInput): HostedHeartbeatDelegationAuthorization | undefined | Promise<HostedHeartbeatDelegationAuthorization | undefined>;
41
+ export type HostedHeartbeatExecutionSettlementInput = HostedHeartbeatExecutionSettlementRequest & {
42
+ signal: AbortSignal;
43
+ };
44
+ /** Product-owned lifecycle around one Coordinator-owned execution attempt. */
45
+ export interface HostedHeartbeatProductExecutionLifecycle {
46
+ prepare(input: HostedHeartbeatExecutionPreparationInput): HostedHeartbeatExecutionPreparationDecision | Promise<HostedHeartbeatExecutionPreparationDecision>;
47
+ settle(input: HostedHeartbeatExecutionSettlementInput): HostedHeartbeatExecutionSettlement['disposition'] | Promise<HostedHeartbeatExecutionSettlement['disposition']>;
42
48
  }
43
- export type HostedHeartbeatDelegationServiceConfig = {
49
+ export type HostedHeartbeatExecutionServiceConfig = {
44
50
  authority: ExecutionAuthorityIssuer;
45
- authorizer: HostedHeartbeatDelegationAuthorizer;
51
+ lifecycle: HostedHeartbeatProductExecutionLifecycle;
46
52
  runtimeSessionNamespace: string;
47
53
  maxExecutionMs: number;
48
54
  now?: () => Date;
49
55
  };
50
- export interface HostedHeartbeatDelegationIssuer {
51
- issue(input: HostedHeartbeatDelegationRequest, signal?: AbortSignal): Promise<HostedHeartbeatDelegation>;
56
+ export interface HostedHeartbeatExecutionApi {
57
+ prepare(input: HostedHeartbeatExecutionPreparationRequest, signal?: AbortSignal): Promise<HostedHeartbeatExecutionPreparation>;
58
+ settle(input: HostedHeartbeatExecutionSettlementRequest, signal?: AbortSignal): Promise<HostedHeartbeatExecutionSettlement>;
52
59
  }
53
- export type HostedHeartbeatDelegationClientConfig = {
60
+ export type HostedHeartbeatExecutionClientConfig = {
54
61
  baseUrl: URL;
55
62
  apiToken: string;
63
+ /** Allows only Docker's explicit local-host alias over HTTP. */
64
+ allowDockerLocalHost?: boolean;
56
65
  fetch?: typeof globalThis.fetch;
57
- path?: string;
66
+ preparePath?: string;
67
+ settlePath?: string;
68
+ requestTimeoutMs?: number;
58
69
  };
59
- export type HostedHeartbeatDelegatedExecutionTransportConfig = {
60
- delegations: HostedHeartbeatDelegationIssuer;
70
+ export type HostedHeartbeatDelegatedExecutionConfig = {
71
+ executions: HostedHeartbeatExecutionApi;
61
72
  executionHost: HeartbeatExecutionHost;
62
73
  modelCredentials: HostedModelCredentialProvider;
63
74
  };
64
- export interface HostedHeartbeatDelegatedExecutionTransportPort {
75
+ export interface HostedHeartbeatExecutionTransportPort {
65
76
  execute(input: HostedHeartbeatAgentExecutionTransportInput): Promise<unknown>;
66
77
  }
78
+ /**
79
+ * Structural subset of Heddle's heartbeat handler context. Keeping this port
80
+ * local avoids making the adopter client depend on the full Runtime package.
81
+ */
82
+ export type HostedHeartbeatCoordinatorExecutionContext<TResult = unknown, TOutcome = unknown> = {
83
+ task: {
84
+ id: string;
85
+ state?: {
86
+ recovery?: {
87
+ interruptedExecutionId: string;
88
+ };
89
+ };
90
+ };
91
+ executionId: string;
92
+ signal: AbortSignal;
93
+ runAgent(): Promise<TResult>;
94
+ skip(input: {
95
+ summary: string;
96
+ }): TOutcome;
97
+ retry(input: {
98
+ summary: string;
99
+ delayMs?: number;
100
+ }): TOutcome;
101
+ block(input: {
102
+ summary: string;
103
+ }): TOutcome;
104
+ };
67
105
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionAuthorityIssuer,\n} from '../authority/index.js';\nimport type {\n HostedModelCredentialProvider,\n} from '../conversation/index.js';\nimport type {\n HostedHeartbeatAgentExecutionTransportInput,\n} from '../heartbeat/index.js';\nimport type { HeartbeatExecutionHost } from '../http-sse/index.js';\nimport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatDelegation,\n HostedHeartbeatDelegationAuthorization,\n HostedHeartbeatDelegationRequest,\n HostedHeartbeatDesiredTask,\n} from './contracts.js';\n\nexport type HostedHeartbeatCoordinatorClientConfig = {\n baseUrl: URL;\n apiToken: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport interface HostedHeartbeatCoordinatorTaskApi {\n readState(signal?: AbortSignal): Promise<HostedHeartbeatCoordinatorState>;\n listTasks(\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView[]>;\n readTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskDetail>;\n upsertTask(\n taskId: string,\n task: HostedHeartbeatCoordinatorTaskInput,\n signal?: AbortSignal,\n ): Promise<void>;\n triggerTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView>;\n deleteTask(taskId: string, signal?: AbortSignal): Promise<void>;\n pause(signal?: AbortSignal): Promise<void>;\n resume(signal?: AbortSignal): Promise<void>;\n drain(signal?: AbortSignal): Promise<void>;\n}\n\nexport type HostedHeartbeatTaskReconciliationInput = {\n desiredTasks: readonly HostedHeartbeatDesiredTask[];\n resume: boolean;\n signal?: AbortSignal;\n};\n\nexport type HostedHeartbeatTaskReconciliation = {\n deleted: number;\n upserted: number;\n resumed: boolean;\n};\n\nexport type HostedHeartbeatTaskReconcilerConfig = {\n coordinator: Pick<\n HostedHeartbeatCoordinatorTaskApi,\n 'listTasks' | 'upsertTask' | 'deleteTask' | 'pause' | 'resume'\n >;\n};\n\nexport type HostedHeartbeatDelegationAuthorizationInput = {\n taskId: string;\n executionId: string;\n signal: AbortSignal;\n};\n\nexport interface HostedHeartbeatDelegationAuthorizer {\n authorize(\n input: HostedHeartbeatDelegationAuthorizationInput,\n ): HostedHeartbeatDelegationAuthorization\n | undefined\n | Promise<HostedHeartbeatDelegationAuthorization | undefined>;\n}\n\nexport type HostedHeartbeatDelegationServiceConfig = {\n authority: ExecutionAuthorityIssuer;\n authorizer: HostedHeartbeatDelegationAuthorizer;\n runtimeSessionNamespace: string;\n maxExecutionMs: number;\n now?: () => Date;\n};\n\nexport interface HostedHeartbeatDelegationIssuer {\n issue(\n input: HostedHeartbeatDelegationRequest,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatDelegation>;\n}\n\nexport type HostedHeartbeatDelegationClientConfig = {\n baseUrl: URL;\n apiToken: string;\n fetch?: typeof globalThis.fetch;\n path?: string;\n};\n\nexport type HostedHeartbeatDelegatedExecutionTransportConfig = {\n delegations: HostedHeartbeatDelegationIssuer;\n executionHost: HeartbeatExecutionHost;\n modelCredentials: HostedModelCredentialProvider;\n};\n\nexport interface HostedHeartbeatDelegatedExecutionTransportPort {\n execute(\n input: HostedHeartbeatAgentExecutionTransportInput,\n ): Promise<unknown>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/coordinator/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ExecutionAuthorityIssuer,\n} from '../authority/index.js';\nimport type {\n HostedModelCredentialProvider,\n} from '../conversation/index.js';\nimport type {\n HostedHeartbeatAgentExecutionTransportInput,\n} from '../heartbeat/index.js';\nimport type { HeartbeatExecutionHost } from '../http-sse/index.js';\nimport type {\n HostedHeartbeatCoordinatorTaskInput,\n HostedHeartbeatCoordinatorState,\n HostedHeartbeatCoordinatorTaskDetail,\n HostedHeartbeatCoordinatorTaskView,\n HostedHeartbeatExecutionPreparation,\n HostedHeartbeatExecutionPreparationDecision,\n HostedHeartbeatExecutionPreparationRequest,\n HostedHeartbeatExecutionSettlement,\n HostedHeartbeatExecutionSettlementRequest,\n HostedHeartbeatDesiredTask,\n} from './contracts.js';\n\nexport type HostedHeartbeatCoordinatorClientConfig = {\n baseUrl: URL;\n apiToken: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport interface HostedHeartbeatCoordinatorTaskApi {\n readState(signal?: AbortSignal): Promise<HostedHeartbeatCoordinatorState>;\n listTasks(\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView[]>;\n readTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskDetail>;\n upsertTask(\n taskId: string,\n task: HostedHeartbeatCoordinatorTaskInput,\n signal?: AbortSignal,\n ): Promise<void>;\n triggerTask(\n taskId: string,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatCoordinatorTaskView>;\n deleteTask(taskId: string, signal?: AbortSignal): Promise<void>;\n pause(signal?: AbortSignal): Promise<void>;\n resume(signal?: AbortSignal): Promise<void>;\n drain(signal?: AbortSignal): Promise<void>;\n}\n\nexport type HostedHeartbeatTaskReconciliationInput = {\n desiredTasks: readonly HostedHeartbeatDesiredTask[];\n resume: boolean;\n signal?: AbortSignal;\n};\n\nexport type HostedHeartbeatTaskReconciliation = {\n deleted: number;\n upserted: number;\n resumed: boolean;\n};\n\nexport type HostedHeartbeatTaskReconcilerConfig = {\n coordinator: Pick<\n HostedHeartbeatCoordinatorTaskApi,\n 'listTasks' | 'upsertTask' | 'deleteTask' | 'pause' | 'resume'\n >;\n};\n\nexport type HostedHeartbeatExecutionPreparationInput = {\n taskId: string;\n executionId: string;\n interruptedExecutionId?: string;\n signal: AbortSignal;\n};\n\nexport type HostedHeartbeatExecutionSettlementInput =\n HostedHeartbeatExecutionSettlementRequest & {\n signal: AbortSignal;\n };\n\n/** Product-owned lifecycle around one Coordinator-owned execution attempt. */\nexport interface HostedHeartbeatProductExecutionLifecycle {\n prepare(\n input: HostedHeartbeatExecutionPreparationInput,\n ): HostedHeartbeatExecutionPreparationDecision\n | Promise<HostedHeartbeatExecutionPreparationDecision>;\n settle(\n input: HostedHeartbeatExecutionSettlementInput,\n ): HostedHeartbeatExecutionSettlement['disposition']\n | Promise<HostedHeartbeatExecutionSettlement['disposition']>;\n}\n\nexport type HostedHeartbeatExecutionServiceConfig = {\n authority: ExecutionAuthorityIssuer;\n lifecycle: HostedHeartbeatProductExecutionLifecycle;\n runtimeSessionNamespace: string;\n maxExecutionMs: number;\n now?: () => Date;\n};\n\nexport interface HostedHeartbeatExecutionApi {\n prepare(\n input: HostedHeartbeatExecutionPreparationRequest,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionPreparation>;\n settle(\n input: HostedHeartbeatExecutionSettlementRequest,\n signal?: AbortSignal,\n ): Promise<HostedHeartbeatExecutionSettlement>;\n}\n\nexport type HostedHeartbeatExecutionClientConfig = {\n baseUrl: URL;\n apiToken: string;\n /** Allows only Docker's explicit local-host alias over HTTP. */\n allowDockerLocalHost?: boolean;\n fetch?: typeof globalThis.fetch;\n preparePath?: string;\n settlePath?: string;\n requestTimeoutMs?: number;\n};\n\nexport type HostedHeartbeatDelegatedExecutionConfig = {\n executions: HostedHeartbeatExecutionApi;\n executionHost: HeartbeatExecutionHost;\n modelCredentials: HostedModelCredentialProvider;\n};\n\nexport interface HostedHeartbeatExecutionTransportPort {\n execute(\n input: HostedHeartbeatAgentExecutionTransportInput,\n ): Promise<unknown>;\n}\n\n/**\n * Structural subset of Heddle's heartbeat handler context. Keeping this port\n * local avoids making the adopter client depend on the full Runtime package.\n */\nexport type HostedHeartbeatCoordinatorExecutionContext<\n TResult = unknown,\n TOutcome = unknown,\n> = {\n task: {\n id: string;\n state?: {\n recovery?: { interruptedExecutionId: string };\n };\n };\n executionId: string;\n signal: AbortSignal;\n runAgent(): Promise<TResult>;\n skip(input: { summary: string }): TOutcome;\n retry(input: { summary: string; delayMs?: number }): TOutcome;\n block(input: { summary: string }): TOutcome;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,gCAAgC;;;;;mHAI5C,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;kBAW1C,CAAC;AAEZ,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;kBAYnD,CAAC;AAcZ,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,wCAAwC,CAAC,CAO1D;AAED,wBAAgB,gDAAgD,CAC9D,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,iDAAiD,CAAC,CAOnE"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,gCAAgC;;;;;mHAI5C,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;kBAW1C,CAAC;AAEZ,eAAO,MAAM,iDAAiD;;;;;;;;;;;;;;kBAYnD,CAAC;AAOZ,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,wCAAwC,CAAC,CAO1D;AAED,wBAAgB,gDAAgD,CAC9D,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,GACzC,CAAC,CAAC,KAAK,CAAC,OAAO,iDAAiD,CAAC,CAOnE"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { JwtAudienceSchema, JwtIssuerSchema, McpServerIdSchema, OpaqueIdSchema, isSafeWebUrl, } from '../contracts/index.js';
2
+ import { JwtAudienceSchema, JwtIssuerSchema, McpServerIdSchema, OpaqueIdSchema, isDockerLocalWebUrl, isSafeWebUrl, } from '../contracts/index.js';
3
3
  import { EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS } from './types.js';
4
4
  export const ExecutionHostJwtAlgorithmsSchema = z.array(z.enum(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS)).min(1).max(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS.length).transform((algorithms) => Object.freeze([...new Set(algorithms)]));
5
5
  export const JwtExecutionIdentityVerifierConfigSchema = z.object({
@@ -21,12 +21,7 @@ export const JwtExecutionHostMcpCapabilityVerifierConfigSchema = z.object({
21
21
  maxCapabilityAgeSeconds: z.number().int().min(1).max(15 * 60),
22
22
  clockToleranceSeconds: z.number().int().min(0).max(60),
23
23
  }).strict();
24
- const DockerLocalJwksUrlSchema = z.instanceof(URL).refine((url) => isSafeWebUrl(url) || (url.protocol === 'http:'
25
- && url.hostname === 'host.docker.internal'
26
- && !url.username
27
- && !url.password
28
- && !url.search
29
- && !url.hash), 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment');
24
+ const DockerLocalJwksUrlSchema = z.instanceof(URL).refine((url) => isSafeWebUrl(url) || isDockerLocalWebUrl(url), 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment');
30
25
  export function parseJwtExecutionIdentityVerifierConfig(input, options) {
31
26
  const schema = options.allowDockerLocalHost
32
27
  ? JwtExecutionIdentityVerifierConfigSchema.extend({
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n JwtAudienceSchema,\n JwtIssuerSchema,\n McpServerIdSchema,\n OpaqueIdSchema,\n isSafeWebUrl,\n} from '../contracts/index.js';\nimport { EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS } from './types.js';\n\nexport const ExecutionHostJwtAlgorithmsSchema = z.array(\n z.enum(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS),\n).min(1).max(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS.length).transform(\n (algorithms) => Object.freeze([...new Set(algorithms)]),\n);\n\nexport const JwtExecutionIdentityVerifierConfigSchema = z.object({\n executionIssuer: JwtIssuerSchema,\n executionAudience: JwtAudienceSchema,\n executionJwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n executionJwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n maxAssertionAgeSeconds: z.number().int().min(1).max(15 * 60),\n assertionClockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nexport const JwtExecutionHostMcpCapabilityVerifierConfigSchema = z.object({\n issuer: JwtIssuerSchema,\n audience: JwtAudienceSchema,\n jwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n jwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n serverId: McpServerIdSchema,\n maxCapabilityAgeSeconds: z.number().int().min(1).max(15 * 60),\n clockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nconst DockerLocalJwksUrlSchema = z.instanceof(URL).refine(\n (url) => isSafeWebUrl(url) || (\n url.protocol === 'http:'\n && url.hostname === 'host.docker.internal'\n && !url.username\n && !url.password\n && !url.search\n && !url.hash\n ),\n 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment',\n);\n\nexport function parseJwtExecutionIdentityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionIdentityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionIdentityVerifierConfigSchema.extend({\n executionJwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionIdentityVerifierConfigSchema;\n return schema.parse(input);\n}\n\nexport function parseJwtExecutionHostMcpCapabilityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionHostMcpCapabilityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionHostMcpCapabilityVerifierConfigSchema.extend({\n jwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionHostMcpCapabilityVerifierConfigSchema;\n return schema.parse(input);\n}\n"]}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/host/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport {\n JwtAudienceSchema,\n JwtIssuerSchema,\n McpServerIdSchema,\n OpaqueIdSchema,\n isDockerLocalWebUrl,\n isSafeWebUrl,\n} from '../contracts/index.js';\nimport { EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS } from './types.js';\n\nexport const ExecutionHostJwtAlgorithmsSchema = z.array(\n z.enum(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS),\n).min(1).max(EXECUTION_HOST_SUPPORTED_JWT_ALGORITHMS.length).transform(\n (algorithms) => Object.freeze([...new Set(algorithms)]),\n);\n\nexport const JwtExecutionIdentityVerifierConfigSchema = z.object({\n executionIssuer: JwtIssuerSchema,\n executionAudience: JwtAudienceSchema,\n executionJwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n executionJwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n maxAssertionAgeSeconds: z.number().int().min(1).max(15 * 60),\n assertionClockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nexport const JwtExecutionHostMcpCapabilityVerifierConfigSchema = z.object({\n issuer: JwtIssuerSchema,\n audience: JwtAudienceSchema,\n jwksUrl: z.instanceof(URL).refine(\n isSafeWebUrl,\n 'must use HTTPS or loopback HTTP and contain no credentials, query, or fragment',\n ),\n jwtAlgorithms: ExecutionHostJwtAlgorithmsSchema,\n trustedAdopterId: OpaqueIdSchema,\n serverId: McpServerIdSchema,\n maxCapabilityAgeSeconds: z.number().int().min(1).max(15 * 60),\n clockToleranceSeconds: z.number().int().min(0).max(60),\n}).strict();\n\nconst DockerLocalJwksUrlSchema = z.instanceof(URL).refine(\n (url) => isSafeWebUrl(url) || isDockerLocalWebUrl(url),\n 'must use HTTPS, loopback HTTP, or the explicit Docker local-host alias without credentials, query, or fragment',\n);\n\nexport function parseJwtExecutionIdentityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionIdentityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionIdentityVerifierConfigSchema.extend({\n executionJwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionIdentityVerifierConfigSchema;\n return schema.parse(input);\n}\n\nexport function parseJwtExecutionHostMcpCapabilityVerifierConfig(\n input: unknown,\n options: { allowDockerLocalHost: boolean },\n): z.infer<typeof JwtExecutionHostMcpCapabilityVerifierConfigSchema> {\n const schema = options.allowDockerLocalHost\n ? JwtExecutionHostMcpCapabilityVerifierConfigSchema.extend({\n jwksUrl: DockerLocalJwksUrlSchema,\n })\n : JwtExecutionHostMcpCapabilityVerifierConfigSchema;\n return schema.parse(input);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AACA,OAAO,EAoBL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAqCpB;;;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;CAmEpD"}
1
+ {"version":3,"file":"direct-http-execution-host.d.ts","sourceRoot":"","sources":["../../src/http-sse/direct-http-execution-host.ts"],"names":[],"mappings":"AACA,OAAO,EAqBL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC9B,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EACV,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAqCpB;;;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;CAmEpD"}